나는 약 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 포함) grep
은 find
.
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은 문자열이 발견된 특정 파일의 줄 번호를 인쇄합니다.