word1
예를 들어 두 단어 와 (예를 들어) 이 포함된 디렉터리 트리에서 모든 텍스트 파일을 찾고 싶습니다 word2
. 두 단어가 연속적으로 나타나는 경우만 찾을 수 있기 때문에 grep
그럴 수 없습니다 . word1 word2
다음을 포함하는 모든 파일을 찾고 싶습니다.둘 다이 두 단어가 반드시 연속되는 것은 아닙니다.
이상적으로는 검색 시 파일 이름과 파일에서 해당 용어가 발견된 컨텍스트를 인쇄해야 합니다. 이것이 도움이 될 것입니다. GUI는 아프지 않을 것입니다.
어떻게 해야 합니까?
답변1
find
파일이 일치하는 것으로 간주되려면 모든 테스트를 통과해야 하는 함수를 사용하겠습니다 . grep
조건과 일치하도록 두 명령을 함께 연결합니다.
find . -type f -exec grep -q word_one {} \; -exec grep -l word_two {} \;
쉘 특수 문자나 정규식 특수 문자가 있는 경우 단어를 인용(또는 사용)하는 것을 포함하여 필요에 따라 grep의 플래그를 조정할 수 있습니다 grep -F
.
답변2
서로 다른 두 단어가 존재하는 파일을 검색하는 방법은 무엇입니까? 기본적인 문제에 대한 좋은 해결책이 많이 있습니다. 컨텍스트를 표시해야 하는 추가 요구 사항을 충족하려면 다음 답변 중 하나를 선택하면 됩니다(예:스티븐의) 그리고 조금 추가하세요:
find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';' \
-exec grep -A3 -B3 -E -H 'word1|word2' {} +
이 find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';'
부분은 Stéphane의 두 번째 답변(이식 가능하지만 간단한 답변)입니다. 여기서 -l
두 번째 옵션 (파일 이름 목록) 은 (상태와 함께 자동으로 검색 및 종료) grep
로 대체됩니다 . -q
그런 다음 최종 결과를 추가하여 grep
결과를 표시합니다. 각 게임이 끝나면 세 줄이 -A3
표시되고 -B3
이전에는 세 줄이 표시됩니다. -E
확장 정규 표현식이 ; word1|word2
없이 작동하도록 \
해야 합니다 . 파일이 하나만 있어도 -H
파일 이름이 강제로 인쇄됩니다.grep
답변3
당신은 이것을 할 것입니다 grep
:
grep -Elrz "word2(.|\n)*word1|word1(.|\n)*word2" .
출력의 콘텐츠를 일치시켜야 하는 경우 l
위 옵션을 제거하세요.
답변4
내 첫 번째 생각은 먼저 포함된 파일을 검색 word1
한 다음 그 안에 포함된 파일을 검색하는 것 word2
입니다.
grep -l word1 -r . | xargs grep -l word2
예:
$ cat FILE
word1
$ cat FILE1
word2
$ cat FILE2
word1
word2
$ grep -l word1 -r . | xargs grep -l word2
FILE2
GNU
사용자 영역 에서 FreeBSD
테스트되었습니다 .