디렉터리 내의 여러 파일에서 여러 문자열을 검색하고 찾은 문자열과 해당 파일 이름을 인쇄합니다.

디렉터리 내의 여러 파일에서 여러 문자열을 검색하고 찾은 문자열과 해당 파일 이름을 인쇄합니다.

나는 약 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/null또는 -H일치하는 파일이 하나만 있거나 grep여러 호출이 필요한 일치 항목이 많아 그 중 하나가 단일 파일과 관련 되어 명령이 하나의 파일에서만 호출되는 경우가 발생할 수 있기 때문에 통과해야 합니다 .

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

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

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

또는 셸에서 재귀 와일드카드를 수행할 수 있습니다. zsh에서는 즉시 사용할 수 있습니다. Bash에서는 먼저 실행해야 하며 shopt -s globstar, bash는 디렉터리에 대한 심볼릭 링크( find또는 zsh와 달리)를 통해 반복된다는 점에 유의하세요.

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

답변3

egrep을 사용하세요:

egrep -n "str1|str2|str3" file_names

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

관련 정보