Grep 로그 및 로그 구분 기호 사이의 텍스트 가져오기

Grep 로그 및 로그 구분 기호 사이의 텍스트 가져오기

grep로그 항목 구분 기호 사이에서 로그를 작성하고 텍스트를 찾는 방법이 있습니까 ? 로그 파일은 줄 항목을 " -------" 문자로 구분합니다. 따라서 텍스트 단어를 검색할 때 로그에서 구분 기호 앞뒤의 모든 줄을 원합니다.

샘플 로그

------------------------------------------------------------------------

    r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines
    Removed unused "Calculated Fields" column entry.
    Jira ID: JIRA-977

------------------------------------------------------------------------

위에서 나는 Fields라는 단어를 Grep하지만 " ----" 줄 사이의 모든 줄을 원합니다.

답변1

레코드의 크기를 알고 있는 경우 일치하는 줄 앞( -B)과 뒤( )에 추가 컨텍스트 줄을 출력할 수 있습니다.-A

grep -A2 -B2 'Fields' sample.log

또는 매치 라인 전후의 맥락을 위해

grep -C3 'Fields' sample.log

내가 아는 한, GNU grep에서 진정한 여러 줄 일치(단일 줄 일치와 컨텍스트가 아닌)를 수행하는 유일한 방법은 개행 문자 중단을 방지하기 위해 플래그 -P와 함께 PCRE 정규식 모드( ) 를 사용하는 것입니다. -z예를 들어 다음을 시도해 볼 수 있습니다.

grep -zPo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'

Fields이는 임의의 문자 또는 개행 문자로 둘러싸인 문자열을 탐욕스럽지 않게 일치시킵니다.개행-하이픈-개행구분 기호. pcregrep의 동등한 표현식은 다음과 같습니다.

pcregrep -Mo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'


이러한 종류의 레코드 구조 데이터에 대한 또 다른 옵션은 awk입니다. 특히 GNU awk는 내부 레코드에 정규식을 사용할 수 있도록 허용합니다.기록 구분 기호RS 예:

$ gawk -vRS='\n-+\n' '/Fields/ {print}' sample.log

r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines

Removed unused "Calculated Fields" column entry.

Jira ID: JIRA-977

답변2

gawk다음 과 유사한 Perl 솔루션스틸드라이버의 답변gawk사용할 수 없는 경우 :

perl -ne 'BEGIN{$/= "-"x72 . "\n"} chomp and print if /Fields/' log_file

72를 구분 기호의 실제 대시 수로 바꾸세요.

관련 정보