grep하려는 용어가 포함된 파일이 있는데, 각 용어는 파일의 한 줄입니다. xargs를 사용하면 이 작업을 수행할 수 있다고 생각합니다. 이와 같은 매뉴얼 페이지의 예에서 무엇을 얻을 수 있습니까?
find ./work -print0 | xargs -0 rm
예 xargs는 사전 파이프 명령의 출력을 인수 끝에 추가합니다. 따라서 find가 반환되면 report.doc
xargs가 생성됩니다 rm report.doc
. 이 이해가 맞나요?
따라서 파일의 값이 grep 명령 중간에 있기를 원하므로 자리 표시자를 지정해야 합니다. 놀면서 시도했지만 {}
성공하지 못했습니다.
$> cat strings.txt | xargs grep {} subdirectory/*
grep: string1: No such file or directory
grep: string2: No such file or directory
xargs가 올바른 도구입니까? 그렇다면 구문은 무엇입니까?
답변1
예, find ./work -print0 | xargs -0 rm
그런 일이 일어날 것입니다 rm ./work/a "work/b c" ...
. 당신은 echo
사용하여 확인할 find ./work -print0 | xargs -0 echo rm
수 있습니다echo
xargs
이름을 중간에 넣으 려면 매개변수로 바꾸려는 항목이 -I[string]
어디에 있는지 추가해야 합니다. 이 경우 예를 들어 를 사용합니다 .[string]
-I{}
<strings.txt xargs -I{} grep {} directory/*
실제로 사용하고 싶은 것은 다음과 같습니다 grep -F -f strings.txt
.
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. (-f is
specified by POSIX.)
따라서 리터럴로 grep -Ff strings.txt subdirectory/*
나타나는 모든 문자열이 strings.txt
발견됩니다. 해당 -F
옵션을 제거하면 파일에서 정규식을 사용할 수 있습니다. 사실, 당신 grep -F "$(<strings.txt)" directory/*
도 그것을 사용할 수 있습니다. 연습하고 싶다면 find
요약에 있는 마지막 두 가지 예를 사용하면 됩니다. 첫 번째 수준 검색이 아닌 재귀 검색을 수행하려는 경우 요약에도 몇 가지 옵션이 있습니다.
요약:
# grep for each string individually.
<strings.txt xargs -I{} grep {} directory/*
# grep once for everything
grep -Ff strings.txt subdirectory/*
grep -F "$(<strings.txt)" directory/*
# Same, using file
find subdirectory -maxdepth 1 -type f -exec grep -Ff strings.txt {} +
find subdirectory -maxdepth 1 -type f -print0 | xargs -0 grep -Ff strings.txt
# Recursively
grep -rFf strings.txt subdirectory
find subdirectory -type f -exec grep -Ff strings.txt {} +
find subdirectory -type f -print0 | xargs -0 grep -Ff strings.txt
-l
실제 줄을 볼 필요가 없다면 이 옵션을 사용하여 일치하는 각 파일의 이름만 가져올 수 있습니다.
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match. (-l is specified by
POSIX.)
답변2
xargs
fgrep
일치시킬 문자열 파일에 정규 표현식이 아닌 문자열만 포함되어 있는 경우 이 도구는 제가 권장하는 최선의 도구가 아닐 수 있습니다.
fgrep -f strings.txt subdirectory/*
"-f" 옵션 없이 전통적인 fgrep
Unix를 사용하는 것이 좋습니다 . 저는 GNU에 "-f" 옵션이 있다고 생각합니다 . 따라서 파일에 정규 표현식이 있으면 GNU 버전을 사용하는 것이 좋습니다.grep
egrep
grep
egrep