вывод строки awk на основе состояния столбца

#shell #awk

#оболочка #awk

Вопрос:

У меня есть журналы приложений, и мне нужно распечатать все строки со временем выполнения, превышающим 10000 мс. В приведенном ниже примере печатается только первая строка, поскольку строка 2 не превышает 10 КБ мс, а строка 3 не показывает никакого времени выполнения.

 SERVICE_NAME:  | API: GetContents  | 20160927000511741 | EXECUTION TIME: 10130(ms)
SERVICE_NAME:  | API: GetContentsExtend  | 20160927000511741 | EXECUTION TIME: 22(ms)
SERVICE_NAME:  | API: GetContentsExtended  | 20160927000511741 | Current TN: -15698724705531331
  

Я мог бы сделать это, выполнив несколько шагов

сохраняет значение выполнения в файле:

 cat logfile.log |   grep "EXECUTION TIME:" | awk '{print $NF}' | cut -d "(" -f1 | awk '{if ($1>9999) print $1}' >> input.txt
  

цикл по этому входному файлу, проходящему через тот же журнал

 cat input.txt | while read line 
do
cat logfile.log | grep $line"(ms)" >> output.txt
done
  

Может ли это быть сделано, возможно, с помощью команды из 1 строки? Что меня затрудняет, так это значение времени выполнения (мс) после него.

Ответ №1:

Если время выполнения> = 10000, то перед строкой «(мс)» будет не менее 5 цифр, поэтому:

 grep -E 'EXECUTION TIME: [[:digit:]]{5,}(ms)' filename
  

Комментарии:

1. Констатируя очевидное, если пороговое значение изменяется, скажем, на 1,234 вместо 1,000, то сопоставление с регулярным выражением не является отличным подходом по сравнению с числовым сравнением.

Ответ №2:

 $ awk '/EXECUTION TIME/ amp;amp; ($NF 0)>=10000' file
SERVICE_NAME:  | API: GetContents  | 20160927000511741 | EXECUTION TIME: 10130(ms)
  

$NF является последним полем в строке, например, строка 10130(ms) . Добавление к нему нуля преобразует результат в число, что означает, что awk разбивает его от первой неразрядной (т. Е. ( ) до конца, и поэтому оно становится числом 10130 . Тогда это просто числовое сравнение для >=10000 .

Комментарии:

1. Совершенно верно. Возможно, вы захотите объяснить механику ($NF 0) и то, как это превращает «10130 (мс)» в число