#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 (мс)» в число