2016-04-12 14 views
1

前の手順で指定したテキストファイルに格納されているいくつかのファイルのパターンに対して、grepで検索したいとします。テキストファイルで指定されたファイルでgrepを使って検索するには?

最初の段階で、私は今、私がしたいPATTERN1含まれるすべてのCSVファイルのファイル名を一覧表示し、filenames.txt

にこれらのファイル名を保存するために

grep -l 'pattern1' *.csv >> ~/filenames.txt 

を使用し、言うことができます上記のすべてのファイルを検索して、2番目のパターンpattern2を探します。 私は

grep -?? 'pattern2' ~/filenames.txt 

のようなコマンドを探しています - ?私は

grep -f patternfile.txt *.csv 

がpatternfile.txtで定義されたパターンのためのすべてのCSVファイルを検索するだろうことを知っているfilenames.txt 内のファイル名を探すためにはgrepに指示します。ファイル名でいっぱいのファイルに指定されたすべてのファイルを検索するためのアナログコマンドがありますか?

私の全体的な問題の別の解決方法についてもお聞きしたいと思います。何らかの形でinterim filenames.txtを除いてステップ1と2を組み合わせていますが、analog grepコマンドがあればそれについて知ることも面白いでしょう。

明らかに、私はpattern1とpattern2を含むファイルを探しているだけではありません。私は、pattern1が少なくとも1回出現するファイルで、pattern2のすべての出現に関心があります(実際にはそれらを数えます)。

+1

最初のコマンドは、ファイル名ではなく、パターンに一致する個々の行を返します。 –

+0

ベンジャミンありがとう。私は質問を更新しました。 – user1323995

答えて

3

あなたはこのためにxargsを使用することができます。

xargs -I {} grep -H 'pattern' {} < ~/filenames.txt 

grep~/filenamesファイルから各行にファイル名に対して実行されます。

これはファイル名のスペースでも機能します。

+1

別の 'xargs'オプション:' grep 'パターン "$(xargs -a filenames.txt)' – Cyb3rFly3r

+2

'xargs'は正しいツールですが、あなたのコマンドはスペースで埋め込まれたファイル名で破壊されます。同じことがコメントに記載されたバリエーションにも当てはまります。 – mklement0

+1

@ mklement0:フェアポイント、私の編集した 'xargs'コマンドは、ファイル名のスペースで動作します。 – anubhava

1

か...

ack --files-from=filenames.txt 'pattern' 
2

へ:

  • は、中間ファイルの必要性を回避、
  • かつ確実にスペースまたはグロブパターン文字を含むファイル名を処理し、

次のようにしてください(LinuxまたはBSD/OSXのいずれかであることを前提とします)。

grep -l --null 'pattern1' *.csv | xargs -0 grep 'pattern2' 
  • -l
  • --nullがNULs
  • xargs -0個々の引数にNULで区切られたファイル名を解析し、それらを通過すると、ファイル名を分離し、一致する場合にのみ、入力ファイル名を印刷するgrepに指示2nd grepコマンド。Linuxの

GNUユーティリティを使用して)、あなたは多少のコマンドを簡素化することができますが、あなたは(非常にまれ)埋め込まれた改行を含むファイル名が心配じゃないと仮定すると:

grep -l 'pattern1' *.csv | xargs -d '\n' grep 'pattern2' 
  • -d '\n'ますxargs各入力行を個別の引数としてみなします。
関連する問題