실행 시간이 X보다 긴 줄을 찾는 방법

실행 시간이 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

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

관련 정보