web-dev-qa-db-ja.com

Grepを使ったネガティブマッチ(fooを含まない行のマッチ)

私はこのコマンドの構文を考え出そうとしています:

grep ! error_log | find /home/foo/public_html/ -mmin -60

または

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

error_logという名前を除いて、変更されたすべてのファイルを見る必要があります。

ここで読みました 、しかしnot-regexパターンは1つしか見つかりませんでした。

819
jerrygarciuh

grep -vはあなたの友達です:

grep --help | grep invert  

-v、--invert-match不一致行を選択する

関連する-L-lの補足)も調べてください。

-L、 - files-without-matchは、一致しないファイル名のみを出力します。

1488
Motti

これらの目的にawkを使用することもできます。これは、より複雑なチェックをより明確な方法で実行できるからです。

fooを含まない行:

awk '!/foo/'

foobarも含まない行

awk '!/foo/ && !/bar/'

foo2またはbar2を含むfoobarも含まない行:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

等々。

110
fedorqui

あなたの場合は、おそらくgrepを使用したくないでしょうが、代わりにfindコマンドに負の句を追加してください。

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

名前にワイルドカードを含める場合は、それらをエスケープする必要があります。拡張子が.logのファイルを除外するには

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
11
Papa Smurf