我有应用程序日志,我需要打印执行时间超过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)。
答案 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
的数字比较。