나는 여러 로그 파일에서 이 패턴이 나타날 때마다 이를 잡으려고 노력하고 있습니다(참고: 이러한 패턴은 크기, 즉 Blah의 양에 따라 크게 다를 수 있습니다).
Found an txt File
Blah
Blah
10019874
Blah
Blah
Processed File
이 명령줄 사용:
pcregrep -M 'Found an.*(\n|.)*10019874.*(\n|.)*Processed' log_*.txt
내 정규식을 확인합니다.여기에 정규식을 입력하세요.
-M 여러 줄 플래그와 함께 pcregrep을 사용하고 있습니다. 'log_'로 시작하고 '.txt'로 끝나는 모든 로그 파일에 해당됩니다. 이 명령을 실행하면 '세그먼테이션 오류'가 반환됩니다.
이 작업을 수행하는 더 간단하고 더 좋은 방법이 있습니까?
답변1
내 의견에서 말했듯이 게시한 명령은 내 LMDE(pcregrep 버전 8.31 2012-07-06)에서 제대로 작동합니다. 그러나 정규식은 찾고 있는 문자열의 일부만 지정하므로 Normal을 사용하여 이 작업을 수행할 수도 있습니다 grep
.
grep -A 6 'Found an' log_*.txt | grep -C 3 10019874
-A 6
전달된 문자열과 일치하는 행과 다음 6개의 행을 인쇄하고 3 -C 3
을 인쇄합니다.주변윤곽. 최종 결과는 pcregrep
사용했던 접근 방식과 정확히 동일합니다.
패턴의 행 수가 다를 수 있는 경우 이는 세그폴트를 설명할 수 있습니다. 아마도 일부 파일에서는 일치하는 섹션이 너무 길어서 메모리 부족 오류가 발생하는 것 같습니다. 이를 해결하는 한 가지 방법은 약간의 스크립팅입니다.
perl -ne '$c=1 if /Found an/; ## set $c to 1 if this line matches 'Found on'
if($c){ ## If $c is defined and non-0
push @F,$_; ## Add the current line to the @F array
$c++ if /10019874/; ## Increment $c if this line matches '10019874'
if(/Processed/){ ## If this line matches 'Processed'
print "@F" if $c>1; ## Print the contents of @F if $c is >1
@F=""; $c=0; ## Empty @F, set $c to 0.
}
}' log_*.txt
하나의 라이너와 같은 것입니다.
perl -ne '$c=1 if /Found an/; if($c){push @F,$_; $c++ if /10019874/; if(/Processed/){print "@F" if $c>1; @F=""; $c=0;}}' log_*txt