디렉토리 내의 여러 파일에서 여러 문자열을 검색하고 문자열과 해당 파일 이름을 발견한 위치에 인쇄

디렉토리 내의 여러 파일에서 여러 문자열을 검색하고 문자열과 해당 파일 이름을 발견한 위치에 인쇄

나는 약 500개의 문자열을 가지고 있고 디렉토리 내부에 문자열이 포함된 파일을 검색하고 문자열이 포함된 파일 이름을 얻고 싶습니다. 지금까지 나는 다음을 사용했습니다.

find -name 'LYFNRE.*' -exec grep -f file1.txt {} \; -print

하지만 문제는 문자열이 많은 파일에서 발견될 수 있기 때문에 엄청난 출력으로 인해 어떤 문자열이 존재하고 어떤 문자열이 누락되었는지 찾기가 어렵다는 것입니다. 문자열이 발견된 해당 파일 이름으로 문자열을 인쇄하는 데 도움을 주실 수 있나요?

답변1

grep파일 이름만 알려주시면 됩니다 . GNU는 grep이것을 할 수 있습니다:

grep -HFf ../strings.txt *

그러면 다음과 같은 출력이 표시됩니다.

[filename]:[matched_line]

...디렉토리에 있는 모든 파일의 모든 일치 항목에 대해. 줄 번호도 얻을 수 있습니다.

grep -HnFf ../strings.txt *

...제공하는 것...

[filename]:[line_number]:[matched_line]

답변2

문제는 한 번에 하나의 파일을 grep. 명령줄에서 단일 파일을 보면 grep사용자가 검색 중인 위치를 정확히 알고 있다고 가정하므로 일치 항목 앞에 파일 이름을 표시하지 않습니다.

항상 파일 이름을 출력하도록 강제하는 방법 grep은 통과하는 것입니다 /dev/null(일치하는 항목이 전혀 없는 경우). 일부 grep 구현에는 다음과 같은 옵션이 있습니다 -H.

또한 한 번에 여러 파일에 대한 프로그램을 실행하는 -exec … {} +대신 을 사용할 수 있습니다 . -exec … {} \;이것이 더 빠릅니다. 일치하는 파일이 하나 있거나 일치하는 항목이 많아 여러 번 호출되고 한 번에 단일 파일과 관련이 있기 때문에 명령이 정확히 하나의 파일에서 호출될 수 있으므로 /dev/nullor 를 계속 전달해야 합니다 .-Hgrep

find -name 'LYFNRE.*' -exec grep -f file1.txt /dev/null {} +

GNU grep 및 최신 BSD 구현(OSX 포함) grepfind.

grep -R --include='LYFNRE.*' -f file1.txt -H .

또는 셸에서 재귀적 globbing을 수행할 수 있습니다. zsh에서는 기본적으로 작동합니다. bash에서는 먼저 실행해야 하며 shopt -s globstarbash는 (또는 zsh와 달리) 디렉토리에 대한 기호 링크를 통해 반복된다는 점에 주의하세요 find.

grep -f file1.txt /dev/null **/LYFNRE.*

답변3

egrep을 사용하십시오 :

egrep -n "str1|str2|str3" file_names

-n 문자열이 발견된 특정 파일의 줄 번호를 인쇄합니다.

관련 정보