개행 문자로 로그를 grep하는 방법

개행 문자로 로그를 grep하는 방법

다음 구조의 로그 파일이 있습니다. 일부 로그에는 개행 문자가 포함됩니다.[query-id=123]

[query-id=123] contentA:
 1. content
 2. content
 3. content
[query-id=124] contentC
[query-id=123] contentB:
 1. contentB
 2. contentB

따라서 내가 grep하려는 것은 로그의 전체 내용이지만 [query-id=123], grep을 하면 query-id=123헤더가 있는 줄만 얻으면 헤더가 있는 줄 다음의 줄 [query-id=123] contentA:[query-id=123] contentB:손실됩니다.

답변1

pcregrepM사용할 수 있는 Ulitline 모드 가 있습니다 :

$ pcregrep -M 'query-id=123\b.*(\n\h.*)*' your-file
[query-id=123] contentA:
 1. content
 2. content
 3. content
[query-id=123] contentB:
 1. contentB
 2. contentB

\hh가로 공백 문자 에 사용됩니다 . 또한 \b단어 b경계에 주목하십시오. 경계가 없어도 query-id=123일치합니다 query-id=1234. 또는 [query-id=123]줄 시작 부분에 grep for를 사용하여 더 명시적으로 지정할 수도 있습니다.

pcregrep -M '^\[query-id=123\].*(\n\h.*)*' your-file

답변2

그리고 awk:

$ awk -v SECTION='\\[query-id=123\\]' '/^\[query-id/ {HEADER=$0} HEADER ~ SECTION {print $0}' file          
[query-id=123] contentA:
 1. content
 2. content
 3. content
[query-id=123] contentB:
 1. contentB
 2. contentB

더 읽기 쉬운:

awk -v SECTION='\\[query-id=123\\]' '
/^\[query-id/ {
  HEADER=$0
}
HEADER ~ SECTION {
  print $0
}' file

또는 헤더가 항상 형식인 경우 전체 헤더 대신 [query-id=<NUMBER>]숫자만 변수로 제공할 수 있습니다 .SECTION

$ awk -v SECTION='123' 'BEGIN {PATTERN=sprintf("^\\[query-id=%s\\]", SECTION)} /^\[query-id/ {HEADER=$0} HEADER ~ PATTERN {print $0}' file
[query-id=123] contentA:
 1. content
 2. content
 3. content
[query-id=123] contentB:
 1. contentB
 2. contentB

읽을 수 있음:

awk -v SECTION='123' '
BEGIN {
  PATTERN=sprintf("^\\[query-id=%s\\]", SECTION)
}

/^\[query-id/ {
  HEADER=$0
}

HEADER ~ PATTERN {
  print $0
}' file

관련 정보