나는 약 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
or 를 계속 전달해야 합니다 .-H
grep
find -name 'LYFNRE.*' -exec grep -f file1.txt /dev/null {} +
GNU grep 및 최신 BSD 구현(OSX 포함) grep
은 find
.
grep -R --include='LYFNRE.*' -f file1.txt -H .
또는 셸에서 재귀적 globbing을 수행할 수 있습니다. zsh에서는 기본적으로 작동합니다. bash에서는 먼저 실행해야 하며 shopt -s globstar
bash는 (또는 zsh와 달리) 디렉토리에 대한 기호 링크를 통해 반복된다는 점에 주의하세요 find
.
grep -f file1.txt /dev/null **/LYFNRE.*
답변3
egrep을 사용하십시오 :
egrep -n "str1|str2|str3" file_names
-n 문자열이 발견된 특정 파일의 줄 번호를 인쇄합니다.