如何grep执行时间大于X的行

如何grep执行时间大于X的行

我的日志中有这一行

invokeSuperLambda执行时间:xxs

其中xx是执行时间,s是静态字母

当我在日志文件上运行此命令时

grep -a "invokeSuperLambda execution time" /root/.pm2/logs/proxy-out-1.log

我明白了

2019-01-13 07:36:44.783,[email protected]:57888: << @@@@ Lambda     
:invokeSuperLambda execution time:0s
2019-01-13 07:37:02.909,[email protected]:58952: << @@@@ Lambda 
:invokeSuperLambda execution time:14s
2019-01-13 07:38:09.820,[email protected]:54992: << @@@@ Lambda 
:invokeSuperLambda execution time:1s
2019-01-13 07:38:11.866,[email protected]:59132: << @@@@ Lambda 
:invokeSuperLambda execution time:357s

我需要一种方法来仅过滤执行时间大于 10 秒的行,因此在上面的示例中我需要获取以下 2 行:

2019-01-13 07:37:02.909,[email protected]:58952: << @@@@ Lambda 
:invokeSuperLambda execution time:14s
2019-01-13 07:38:11.866,[email protected]:59132: << @@@@ Lambda 
:invokeSuperLambda execution time:357s

答案1

你可以用这样的脚本来做到这一点:

TIMEX=10
awk -F\: -v timex=$TIMEX '{if (int($NF) > timex) print}' /root/.pm2/logs/proxy-out-1.log

添加你的 grep 脚本变得像这样:

TIMEX=10
grep -a "invokeSuperLambda execution time" /root/.pm2/logs/proxy-out-1.log|awk -F\: -v timex=$TIMEX '{if (int($NF) > timex) print}'

答案2

假设这些行在“Lambda”之后继续,正如OP所建议的,这个命令应该有效:

gawk 'match($0, /execution\stime:([0-9]+)s/, a) && a[1] > 10 { print $0 }' logfile

'logfile' 是日志文件的名称 (/root/.pm2/logs/proxy-out-1.log)

该解决方案使用该match函数将执行时间捕获为括号组,然后根据捕获的值进行数值比较来决定是否应打印该行。

更长但更便携的版本是:

awk 'match($0, /execution time:([0-9]+)s/) && substr($0, RSTART+15, RLENGTH-16 ) > 10 { print }' testfile

答案3

根据评论

grep -a -E "invokeSuperLambda execution time:[0-9]{2,}s" /root/.pm2/logs/proxy-out-1.log

在哪里

  • -E表示扩展正则表达式
  • [0-9]{2,}2 个或更多字符0到字符9

相关内容