내 로그에 이 줄이 있어요
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
OP에서 제안한 대로 이 줄이 "Lambda" 뒤에 계속된다고 가정하면 다음 명령이 작동합니다.
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