패턴 전후에 다른 줄 수를 인쇄합니다.

패턴 전후에 다른 줄 수를 인쇄합니다.

수백 개의 섹션을 포함하는 반복 패턴을 가진 수천 개의 파일이 있는 디렉토리가 있습니다.

###############
# Section 1
###############
some text
more text
some more text
some text
more text
some more text    
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    
###############
# Section 3
###############
some text
more text
some more text
some text
more text
some more text

내가 해야 할 일은 "흥미로운 패턴"이 존재하는 전체 섹션을 추출하는 방법을 찾는 것입니다.

-A 및 -B 플래그를 사용하여 grep -iEr 'interesting-pattern'을 시도했지만 각 파일에서 흥미로운 패턴 앞뒤 부분의 행 수가 다를 수 있기 때문에 작동하지 않았습니다.

이를 수행하는 가장 좋은 방법은 무엇입니까?

답변1

이것은 grep의 작업이 아니라 awk와 같은 더 나은 도구의 작업입니다.

간단한 해결 방법은 gnu awk와 사용자 정의 레코드 구분 기호 RS(예: Section.

줄을 구분하려면 "Section"이라는 단어를 사용하세요. 단어 사이의 모든 내용은 awk에 의해 줄로 처리됩니다 Section 1. 2절~3절 등은 동일합니다. Section 2

이제 올바른 "line" = contain 을 인쇄하면 됩니다 interesting-pattern.

$ awk -v RS="# Section " '/interesting-pattern/{print RT $0}' file1
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    
###############

gnu awk는 RS(Record Separator)에서 정규식을 허용하므로 다음과 같이 RS에서 더 복잡한 내용을 적용할 수도 있습니다.

$ awk -v RS="###############\n# Section " '/interesting-pattern/{print RT $0}'
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    

PS: {print RT현재 사용되는 레코드 구분 기호를 인쇄하도록 awk에 지시합니다.

관련 정보