"find" 및 "grep"을 사용하여 "where" 절과 동일한 작업을 수행하는 방법

"find" 및 "grep"을 사용하여 "where" 절과 동일한 작업을 수행하는 방법

텍스트 파일의 폴더 트리가 있고 하위 문자열의 인스턴스와 해당 파일의 이름을 찾고 싶습니다.

내가 다음과 같은 일을 한다면:

find . | xargs cat | grep 'abc'

그러면 하위 문자열의 인스턴스를 찾을 수 있지만 원래 있던 파일은 찾을 수 없습니다.

도와주셔서 감사합니다!

답변1

이렇게 실행하면 xargs cat파일 이름이 손실되며 데이터가 파이프를 통해 흐르는 동안 파이프에 전달할 수 있는 좋은 방법이 없습니다.

그러나 grep -l일치하는 문자열이 있는 파일 이름이 나열되므로 다음을 사용할 수 있습니다.

find . -type f | xargs grep -l hello

또는 디렉터리를 재귀적으로 검색하면 grep -r공백이나 따옴표가 포함된 파일 이름 문제도 해결할 수 있습니다.xargs

grep -lre abc .

파일 이름뿐만 아니라 일치하는 문자열도 원하는 경우 -l일반적인 grep동작을 얻으려면 제거하십시오. 를 사용하면 -r명령줄에 경로를 제공하더라도 일치하는 파일 이름을 인쇄해야 합니다.

답변2

xargs중복됩니다. xargs cat | grep이렇게 하면 grep모든 파일의 연결된 내용이 포함된 이름 없는 입력 스트림만 표시됩니다. 로 변경:

find . -type f -exec grep -H 'abc' {} +

이는 파일별로 호출됩니다( 여러 파일을 인수로 호출하여 grep인스턴스 수를 최소화합니다 ).grepgrep

답변3

find ./ -type f -exec grep -H abc {} \;

또는

grep -R 'abc' ./

답변4

awk대신에 cat 시도 하고grep

find . -type f | xargs awk '/abc/{printf "%s is from %s\n", $0, FILENAME}'

아니면 그냥 사용 find하고awk

find . -type f -exec awk '/abc/{printf "%s is from %s\n", $0, FILENAME}' {} +

관련 정보