다음 구조의 로그 파일이 있습니다. 일부 로그에는 개행 문자가 포함됩니다.[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
pcregrep
M
사용할 수 있는 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
\h
h
가로 공백 문자 에 사용됩니다 . 또한 \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