
(UbuntuではなくLinuxに関連していて、私のOSはUbuntuではないので、Ask-ubuntuからの独自の移行)
私は次のようなgrepを作成しようとしています。
grep -r 2019 | grep -riv FAILED | grep -rl DSL
-l
()が含まれていて含まれていない()が含まれているファイルのファイル名を取得したいと思います。2019
-v
FAILED
DSL
ここでは最後の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
これは、現在のディレクトリとサブディレクトリのすべての一般ファイルを(再帰的に)インポートし、文字列と(大文字と小文字を区別しない2019
)DSL
がFAILED
含まれているかどうかをテストします。最初の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
。
答え2
GNU grep
(-r
すでにGNU拡張)とGNUと互換性がありますxargs
。
grep -rlZ 2019 . |
xargs -r0 grep -LiZ FAILED |
xargs -r0 grep -l DSL
xargs
ファイルのリストを渡せる必要があります。出力grep
一つずつ議論次にgrep
。そして、-Z
ファイルのリストはNULで区切られます。 FAILEDを含まないファイルのリストを報告するために、このツール-L
(GNU拡張子でもあります)は、-vl
1つ以上の一致しない行を含むファイルを報告します。
これにより、呼び出し数をgrep
最小限に抑える必要があり、ファイル数が多い場合は最大3つのプロセッサを同時に利用できます。