ファイル内を見つけるためのパイプライン grep

ファイル内を見つけるためのパイプライン grep

(UbuntuではなくLinuxに関連していて、私のOSはUbuntuではないので、Ask-ubuntuからの独自の移行)

私は次のようなgrepを作成しようとしています。

grep -r 2019 | grep -riv FAILED | grep -rl DSL

-l()が含まれていて含まれていない()が含まれているファイルのファイル名を取得したいと思います。2019-vFAILEDDSL

ここでは最後のgrepのみが実行されます。私はこれが原因であることを知っているので、-r各grepは以前の結果の代わりにすべてのファイルをgrepします。しかし、なければ、どのように機能させることができるかわかりません-r

おそらく、いくつかのパターンを使用してgrepする別の方法があるかもしれませんが、「肯定的」と「否定的な」一致が見つかりませんでした。

ベストアンサー1

grepパイプの最後の項目は前の項目から読み取られるので、grep(オプションを使用していない場合は-r後で参照)、何から始めるべきかはわかりません。文書データは以下から提供されます。これは、ファイルのパス名を報告できないことを意味します。

代わりに、find次のようにしてみてください。

find . -type f \
    -exec grep -q 2019 {} \; \
    -exec grep -q DSL {} \; \
    ! -exec grep -qi FAILED {} \; \
    -print

これは、現在のディレクトリとサブディレクトリのすべての一般ファイルを(再帰的に)インポートし、文字列と(大文字と小文字を区別しない2019DSLFAILED含まれているかどうかをテストします。最初の2つの文字列を含むファイルのパス名を印刷しますが、3番目の文字列は印刷しません。

ファイルが含まれていない場合は他の2つのテストは行われず、2019含まれていない場合は最後のテストは行われませんDSL

3回目のテストではgrep -v -qi FAILED否定を使用しませんでした。grep -qi FAILED私はファイルにそうでない行が含まれているかどうかに興味がなく、ファイルにFAILED含まれているかどうかに興味があります。含む FAILED、この場合、このファイルをスキップしたいと思います。

関連:


配管の問題、

grep -r 2019 | grep -riv FAILED | grep -rl DSL

grep現在のディレクトリとその下のディレクトリにあるすべてのファイルを再帰的に見つけ、パイプラインの前のステップの入力を無視する最後のディレクトリです。 2回の最初のgrep呼び出しはいくつかのデータを生成できますが、パイプを介してそのデータを渡すことはできず、最終的に最後の呼び出しが完了するgrepと終了します。

また、上記ですでに指摘したように、middleはをgrep含まないファイルを探すのではなくFAILED、Exceptを含むファイルを探しますFAILED。ところで、そうだ返品前の入力を無視しますgrep

おすすめ記事