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

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

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

72를 구분 기호의 실제 대시 수로 바꿉니다.

관련 정보