2016-09-30 98 views
0

我有应用程序日志,我需要打印与执行时间超过10000毫秒的所有行的状态。在下面的示例中,只打印第一行,因为第2行不会超过10k毫秒,第3行不显示任何执行时间。AWK打印行基于列

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 

灿这可以通过一个命令来完成吗?什么让我很困难的是执行时间值后有(毫秒)。

回答

2

如果执行时间是> = 10000,然后将有字符串 “(MS)” 之前至少5位,所以:

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

说明明显,如果阈值变化的说法,而不是1,234 1,000然后用正则表达式匹配的是不是一个伟大的方式VS数值比较。 –

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

$NF是线路上的最后一个字段,例如字符串10130(ms)。将零加到它将结果转换为一个数字,这意味着awk从第一个非数字(即()开始剥离并结束,因此它变成号码10130。然后它只是>=10000的数字比较。

+1

非常正确。您可能想要解释'($ NF + 0)'的机制,以及如何将“10130(ms)”转换为 –

+0

。完成。 –