基于列

时间:2016-09-30 18:50:52

标签: shell awk

我有应用程序日志,我需要打印执行时间超过10000毫秒的所有行。在下面的示例中,只打印第一行,因为第2行不超过10k ms,第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-liner命令完成吗?给我带来困难的是执行时间值在它之后有(ms)。

2 个答案:

答案 0 :(得分:2)

如果执行时间>> 10000,那么在字符串“(ms)”之前将至少有5位数,所以:

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

答案 1 :(得分:1)

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

$NF是该行的最后一个字段,例如字符串10130(ms)。向它添加零会将结果转换为数字,这意味着从第一个非数字(即()到结束的awk条带,因此它变为数字10130。然后它只是>=10000的数字比较。