grep
(linux) 또는 findstr
(dos)와 같이 텍스트를 찾는 데 사용할 수 있지만 다른 특정 텍스트/패턴이 발견된 후에만 검색을 시작할 수 있는 유틸리티가 있습니까 ?
파일에서 주어진 텍스트/패턴을 찾으려고 하는 것과 같지만 파일의 특정 섹션 안에 있는 것만 찾습니다. 내 경우에는 '파일'만 다른 프로그램의 출력이고 출력되는 줄의 양이 너무 많아서 파일에 쓰고 거기에서 분석할 수 없습니다.
예:
section ONE
text_a
text_b
text_c
section TWO
text_b
text_c
section THREE
. . .
섹션 2에서만 "text_c"가 있는지 찾으십시오.
님의 옵션을 읽으려고 했지만 grep
이 기능이 없는 것 같습니다. "text_c"가 섹션 이름보다 훨씬 길기 때문에 이는 문자열 비교의 양을 최소화할 것으로 예상됩니다.
답변1
이 테스트 파일을 고려해 보겠습니다.
$ cat file
section ONE
text_a
text_b
text_c <-ignore this
section TWO
text_b
text_c <-keep this
section THREE
text_a
text_b
text_c <-ignore this
text_c
다음을 포함하는 행을 선택하려면 다음을 수행하십시오 section TWO
.
$ awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/' file
text_c <-keep this
입력이 파일이 아닌 에서 생성된 경우 command
다음을 사용합니다.
command | awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/'
작동 원리
/^section/{f=0}
로 시작하는 줄을 찾을 때마다 를
section
설정하세요f=0
./^section TWO/{f=1}
행이 로 시작하는 경우
section TWO
이전 명령을 무시하고 를 설정하십시오f=1
.f && /text_c/
가
f
0이 아니고 현재 줄이 와 일치하면text_c
줄을 인쇄합니다.
답변2
다음 과 같이 이 작업을 수행할 수도 있습니다 sed
.
command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'
이는 다음과 같이 작동합니다.
-n
sed
기본적으로 일치하는 줄을 인쇄하지 않도록 지시합니다 .-e
sed
작업할 스크립트를 제공합니다 ./section TWO/,/section THREE/
section TWO
주소 범위를 설정하므로 일치하는 줄 과 일치하는 줄 사이의 모든 줄에 다음 함수를 적용할 것입니다 .section THREE
{ /text_c/p;}
줄과 일치하는 함수를 정의하고text_c
, 찾으면p
인쇄 합니다.
답변3
각 섹션을 따르는 줄 수가 어느 정도 일정하다면 '-A'를 사용할 수 있습니다.엑스인쇄할 grep의 ' 옵션엑스섹션 일치 다음에 나오는 줄. 그런 다음 '섹션 2' 내에서 패턴을 찾는 두 번째 grep으로 파이프될 수 있습니다.
$ cat file
section ONE
1 text_a
1 text_b
1 text_c
section TWO
2_text_a
2 text_b
2 text_c
section THREE
3 text_a
3 text_b
3 text_c
$ grep -A3 'section TWO' file | grep text_c
2 text_c