我的日志中有这一行
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