xargs를 사용하여 여러 패턴을 grep

xargs를 사용하여 여러 패턴을 grep

grep하려는 용어가 포함된 파일이 있는데, 각 용어는 파일의 한 줄입니다. xargs를 사용하면 이 작업을 수행할 수 있다고 생각합니다. 이와 같은 매뉴얼 페이지의 예에서 무엇을 얻을 수 있습니까?

find ./work -print0 | xargs -0 rm

예 xargs는 사전 파이프 명령의 출력을 인수 끝에 추가합니다. 따라서 find가 반환되면 report.docxargs가 생성됩니다 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

xargsfgrep일치시킬 문자열 파일에 정규 표현식이 아닌 문자열만 포함되어 있는 경우 이 도구는 제가 권장하는 최선의 도구가 아닐 수 있습니다.

fgrep -f strings.txt subdirectory/*

"-f" 옵션 없이 전통적인 fgrepUnix를 사용하는 것이 좋습니다 . 저는 GNU에 "-f" 옵션이 있다고 생각합니다 . 따라서 파일에 정규 표현식이 있으면 GNU 버전을 사용하는 것이 좋습니다.grepegrepgrepegrep

관련 정보