여러 파일에서 여러 줄 grep을 수행하는 방법은 무엇입니까?

여러 파일에서 여러 줄 grep을 수행하는 방법은 무엇입니까?

나는 여러 로그 파일에서 이 패턴이 나타날 때마다 이를 잡으려고 노력하고 있습니다(참고: 이러한 패턴은 크기, 즉 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 

관련 정보