2016-09-30 4 views
0

응용 프로그램 로그가 있으며 실행 시간이 10000ms를 초과하는 모든 행을 인쇄해야합니다. 아래 샘플에서는 2 행이 10kms를 초과하지 않고 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 input.txt | while read line 
do 
cat logfile.log | grep $line"(ms)" >> output.txt 
done 

가 수 같은 로그를 가로 지르는이 입력 파일을 통해

cat logfile.log | grep "EXECUTION TIME:" | awk '{print $NF}' | cut -d "(" -f1 | awk '{if ($1>9999) print $1}' >> input.txt 

루프 이것은 아마 1 라이너 명령으로 할 수 있을까요? 내게 힘든 시간을주는 무엇이 실행 시간 가치는 (ms) 후에있다.

답변

2

실행 시간이> = 10000의 경우, 너무 문자열 "(MS)"전에 적어도 5 개 자리가있을 것입니다 :

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

임계 값이 1,000 대신에 1,234로 변경되면 정규 표현식과 일치하는 것은 수치 비교와 비교할 때 큰 방법이 아닙니다. –

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

$NF은 행의 마지막 필드 , 예. 문자열 10130(ms). 0을 추가하면 결과가 숫자로 변환됩니다. 즉 숫자가 아닌 첫 번째 숫자 (예 : ()에서 끝까지 awk가 제거되어 숫자 10130이됩니다. 그런 다음 >=10000에 대한 숫자 비교 일뿐입니다.

+1

맞아. '($ NF + 0)'의 메카니즘을 설명하고 "10130 (ms)"을 숫자로 바꾸는 방법을 설명하고 싶을 수도 있습니다. –

+0

충분합니다. 끝난. –

관련 문제