xargsを使用して複数のパターンをgrepする


12

grepする用語が含まれるファイルがあり、各用語はファイル内の1行です。私はこれをxargsでできると考えていました。このようなmanページの例から収集できるもの

find ./work -print0 | xargs -0 rm

xargsはpre-pipeコマンドの出力を引数の最後に追加するということです。したがって、検索結果が返された場合、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は適切なツールですか?もしそうなら、構文は何ですか?

回答:


17

はい、のfind ./work -print0 | xargs -0 rmようなものを実行しますrm ./work/a "work/b c" ...。で確認できechofind ./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は、要約の最後の2つの例を使用できます。最初のレベルだけでなく再帰的な検索を行う場合は、いくつかのオプションがあります。これも概要にあります。

概要:

# 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.)

4

xargsfgrep一致する文字列のファイルに正規表現ではなく文字列のみが含まれる場合、私がお勧めする最良のツールではないかもしれません。

fgrep -f strings.txt subdirectory/*

私が提案するfgrep伝統的なUnixとgrepし、egrep「-f」オプションを持っていませんでした。私はGNUと信じているgrepegrep、あなたのファイルがその中に正規表現を持っている場合は、「-f」オプションを持っているが、そう、あなたはGNUバージョンを使用したいと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.