Помощь с командой awk - PullRequest
       8

Помощь с командой awk

1 голос
/ 09 июля 2020

Здравствуйте, у меня есть файл журнала, в котором "каждая" строка журнала находится в следующем формате:

Jun 26 11:10:27 ip-1-4-5-6 snx: {"@message":"Successful response body: {\"payload\":
[{
\"LID\":\"\",
\"EID\":\"75~1\",
\"SNFlag\":1,
\"Error\":\"Match found\"

},{\"LID\":\"\",
\"EID\":\"78~10\",
\"SNFlag\":1,
\"Error\":\"Match found\"

},{\"LID\":\"\",
\"EID\":\"385~25\",
\"SNFlag\":1,
\"Error\":\"Match found\"

},{\"LID\":\"3e76j5866\",
\"EID\":\"85~26\",
\"SNFlag\":1},

},{\"LID\":\"\",
\"EID\":\"33~9\",
\"SNFlag\":1,
\"Error\":\"Match found\"

}]} UniqueNonce: 1593169824239","@timestamp":"2020-06-26T11:10:27.837Z","@fields":{"gID":"sand_entry","logID":"x82","component":"ABC","level":"info"}}

Могу ли я получить некоторую помощь по приведенному ниже, поскольку я пробовал несколько методов проб и ошибок, но не удалось получить точное количество. Мое требование заключается в том, что всякий раз, когда возникает ошибка с надписью «Совпадение найдено», мне нужно распечатать EID таких строк, а затем их количество во всем файле журнала. Обратите внимание, что указанный выше формат - это только одна строка журнала, и у меня много таких строк в моем файле журнала.

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Не могли бы вы попробовать следующее, написанное на основе показанных вами примеров с GNU awk.

tac Input_file | 
awk -F"\"" '
/\\"Error\\":\\"Match found\\"/{
  found=1
}
found && /EID/{
  sub(/\\/,"",$(NF-1))
  print $(NF-1)
  count++
  found=""
}
END{
  print "Total matches found are:" count
}'

Пояснение: Добавление подробного объяснения вышеизложенного.

tac Input_file |                                 ##Printing Input_file in reverse order to get line with ERROR before EID line to make it easy.
awk -F"\"" '                                     ##Sending tac output to awk and setting field separator as " here.
/\\"Error\\":\\"Match found\\"/{                 ##Checking condition if line has \"Error\":\"Match found\" in it then do following.
  found=1                                        ##Setting found here which is proof that Error line has found in current line.
}
found && /EID/{                                  ##Checking condition if found is SET and current line has EID in it then do following.
  sub(/\\/,"",$(NF-1))                           ##Substituting \ with NULL in 2nd last field.
  print $(NF-1)                                  ##Printing 2nd last field here which has actual EID value in it.
  count++                                        ##Increasing count value by 1 here.
  found=""                                       ##Nullifying found here.
}
END{                                             ##Starting END block from here.
  print "Total matches found are:" count         ##Printing total count of matches here for whole Input_file.
}'
1 голос
/ 09 июля 2020
awk -F \" '/EID/{ sub(/\\/,"",$(NF-1)); eid=$(NF-1); print eid }' Input_file

Будет печатать все значения eid следующим образом:

75~1
78~10
385~25
85~26
33~9

Поскольку вы хотите печатать eid только тогда, когда есть error, измените это (и добавьте count):

awk -F \" '/EID/{ sub(/\\/,"",$(NF-1)); eid=$(NF-1); }
          /Error/{ print eid; count++;}
          END{ print "Count:" count } ' Input_file

вывод:

75~1
78~10
385~25
33~9
Count:4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...