TL&DR

TL&DR

AND 연산을 수행하는 위치를 조사해 보았는데 grep -e이것이 바로 제가 원하는 것입니다. 그러나 내가 올바르게 수행한 경우 두 용어가 반환되려면 같은 줄에 있어야 합니다.

내가 관심 있는 것은 디렉토리에서 두 용어를 모두 포함하는 모든 문서를 찾는 것입니다. 아마도 다른 줄에 있을 수도 있습니다. 순서가 중요하다면 한 용어가 항상 다른 용어보다 먼저 온다는 것을 알고 있지만 물론 일반적인 솔루션도 괜찮을 것입니다.

답변1

TL&DR

노트: 어느 것이 가장 빠른지 스스로 테스트해야 합니다.

grep -rlzE '(TermOne.*TermTwo)|(TermTwo.*TermOne)'

find . -type f -exec grep -q 'TermOne' {} \; \
               -exec grep -q 'TermTwo' {} \; \
               -print

awk '/TermOne/{if(p==0)p=1; if(p==2)p=3}
     /TermTwo/{if(p==0)p=2; if(p==1)p=3}
     p==3{print FILENAME;p=0;nextfile}' ./*

파일

파일에서 두 개의 개별 문자열을 일치시킬 수 있는 정규식을 작성할 수 없습니다.

두 용어 모두 다음 중 하나를 사용하여 검색할 수 있습니다.

grep -E '(TermOne.*TermTwo)|(TermTwo.*TermOne)' file

또는 미리보기:

grep -P '(?=.*TermOne)(?=.*TermTwo)' file

하지만 전제는 이 두 항목이같은 줄에

GNU grep -z옵션을 사용하여 전체 파일이 하나의 파일처럼 작동하도록 만들 수도 있습니다(파일에 NUL이 포함되어 있지 않은 경우, Unix 텍스트 파일은 포함되지 않음).

grep -zE '(TermOne.*TermTwo)|(TermTwo.*TermOne)' file

with 를 동시에 사용할 수 없으므로 -z현재로서는 실행 가능한 미리보기 솔루션이 없습니다.-P

또 다른 옵션은 두 번 grep하는 것입니다.

<file grep 'TermOne' | grep -q 'TermTwo'

0파일에서 두 용어가 모두 발견되는 경우에만 전체 파이프라인의 종료 코드가 신호됩니다.

또는 awk를 사용하세요.

awk '/TermOne/{if(p==0)p=1; if(p==2)p=3}
     /TermTwo/{if(p==0)p=2; if(p==1)p=3}
     p==3{print "both terms found"; exit}' file

파일 나열

위의 처음 두 솔루션은 옵션 -r(재귀적, 파일 이름 필요 없음) 및 -l(일치하는 파일 이름 나열)을 추가하여 모든 파일을 재귀적으로 나열합니다.

grep -rlzE '(TermOne.*TermTwo)|(TermTwo.*TermOne)'

또는 find(두 개의 grep 호출)를 사용하십시오.

find . -type f -exec grep -q 'TermOne' {} \; -exec grep -q 'TermTwo' {} \; -print

또는 awk를 사용하십시오(glob에는 PWD만 포함됩니다).

awk '/TermOne/{if(p==0)p=1; if(p==2)p=3}
     /TermTwo/{if(p==0)p=2; if(p==1)p=3}
     p==3{print FILENAME;p=0;nextfile}' ./*

관련 정보