find와 grep을 한 줄에 사용할 수 있나요?

find와 grep을 한 줄에 사용할 수 있나요?

이벤트 기반 디렉토리 구조가 있습니다.

이러한 이벤트에는 검색해야 하는 패턴이 포함되어 있거나 포함되어 있지 않은 파일 유형이 있습니다. 긍정적인 결과를 별도의 파일에 저장하고 싶습니다.

나의 첫 번째 접근 방식은 다음과 같습니다.

find . /EVENT*/'filename' | grep 'searchtext' head -2 > error_file

그러나 이것은 작동하지 않는 것 같습니다. 이 방법으로는 합칠 수 없다고 find하는데 grep어떻게 해야 하나요?

답변1

이것은 일반적인 패턴입니다:

find /directory/containing/files -type f -exec grep -H 'pattern_to_search' {} +

여기서는 find필요한 파일이 포함된 디렉터리의 모든 파일이 먼저 검색됩니다. 이 경우 명령은 *.txt다음과 같습니다..txt

find /directory/containing/files -type f -name "*.txt" -exec grep -H 'pattern_to_search' {} +

-exec grep -H 'pattern_to_search' {} +필요한 파일을 찾은 후 -H(패턴이 발견된 파일 이름을 인쇄합니다)를 사용하여 이 파일에서 필요한 패턴을 검색합니다. 여기서는 {}검색하려는 파일이 포함된 것으로 생각할 수 있으며 , 한 번만 포크하면 명령 처럼 검색되도록 +마지막에 사용해야 합니다 .-exec-execgrepgrep -H 'pattern_to_search' file_1.txt file_2.txt file_3.txt

답변2

또 다른 효과적인 접근 방식은 다음과 같습니다.

 find /directory/containing/files -type f -print0 | xargs -0 grep "test to search"

print0 / 옵션 -0은 파일 이름 문자열에 공백과 같은 특수 문자가 포함된 경우를 허용합니다.

답변3

하나의 프로세스만 사용하는 방법도 있습니다( find, , -exec제외 xargs).

grep -r "test to search" /directory/containing/files

어쨌든 GNU grep을 사용하세요. :)

ETA: 옵션을 표시하라는 요청을 받았으므로 grep --include다음은 heemayl의 예와 유사한 예입니다("*.txt와 같은 와일드카드를 사용하여 .txt로 끝나는 파일만 찾을 수도 있습니다").

grep --include '*.txt*' -r "pattern to search" /directory/containing/files

편집할 때 그렇습니다. 이것은 직접 대체가 아닌 대안입니다. 이 명령은 심볼릭 링크를 통해 (일반) 파일을 읽습니다. (그렇지만 심볼릭 링크 디렉토리를 통해 재귀하지는 않습니다. 그러려면 그렇게 해야 합니다 -R.) 또한 소켓, 명명된 파이프 및 장치 파일도 읽습니다(물론 -D skip추가하거나 건너뛸 수는 있지만). 그리고 이와 같은 옵션의 효과를 얻을 수 있는 방법은 없습니다 grep. 필요한 경우 - 사용하지 않으면 좋은 선택이라고 생각합니다.find-mtime -2findgrep

답변4

특정 패턴을 찾기 위해 텍스트 파일을 grep하고 하위 디렉터리를 반복해야 한다고 가정합니다. GNU grep을 사용하면 매우 간단합니다.

cd /to/the/top/level    
grep -r "PatternToSearch" *

-r-R대신에 또는 를 사용할 수 있습니다 .--recursive

검색 패턴에 공백이 있으면 따옴표를 사용해야 합니다.

GNU grep에는 많은 옵션이 있습니다. 그냥 입력 grep --help하면 놀랄 것입니다!

관련 정보