Grep複数パターンの負の一致


14

そのため、標準のログ形式を使用したApacheログがたくさんあります。Webクローラーからではないすべてのログ行を取得したい。

次のようなエントリを持つファイルrobot_patternsがあるとします

Googlebot
msnbot-media
YandexBot
bingbot

コマンドを実行grep -f robot_patterns *.logすると、上記のパターンに一致するボットによってすべてのエントリが取得されます。私の実際のリストには、無視したいボットとエージェントのエントリが30個ほどあります。

しかし、ボットからのものではないすべてのエントリを見つけたいです。試してみてgrep -v -f robot_patterns *.log、grepから結果が返されないようにします。これは私が期待または望んでいるものではなく、私が望むものを手に入れるための明白な方法を見つけていません。-vファイル内の複数のパターンと組み合わせてオプションを使用する場合、grepはすべてのパターンに一致する場合にのみ一致する行を返します。


私のシステムでこれを試してみたところ、grep -v -fには目的の動作があり、パターンに一致しない行のみが返されました。これは(GNU grep)2.14.56-1e3dの場合でした。どのgrepを使用していますか?
wingedsubmariner

私は走っていGNU grep 2.6.3ます。
ゾレダチェ

4
さらにテストを行ったところ、パターンファイルに空の行がある場合、すべての行に一致するため、-vで行が返されないことがわかりました。ただし、これは-Fの問題ではなく、-Fはタスクのgrepを高速化する可能性があります-試してみる価値があります。
wingedsubmariner

末尾の空行!ああ...それが問題のようです。必要に応じて、回答として追加する必要があります。
ゾレダチェ

回答:


8

パターンファイルに空の行がある場合、すべての行に一致するため、で返される行はありません-v。これは、行が正規表現として解釈され、空の正規表現が常に一致するためです。

-Fただし、のgrep空行は無視されるため、これは問題ではありません-F
-F原因grepを検索するとスピードアップがあり、単純な文字列として行を解釈するgrep正規表現を必要としない場合。


1
fgrep末尾の空の文字列を無視するGNU は、2.19で修正されたバグでした(コミット2d3832e1ff772dc1a374bfad5dcc1338350cc48bであるため、これに依存すべきではありません。
StéphaneChazelas 15年

13

あなたが試すことができます:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
Unix&Linuxへようこそ。OPには無視したい約30の文字列のリストがあり、例として彼が提示した4つの文字列はそれぞれ平均10文字なので、コマンドは300文字を超える可能性があります。これは維持するのが難しい(そして読むのも難しい)可能性があります。OPの文字列リストによって駆動されるように回答を変更できますか?………………………………………………………PS答えが見つかったことに気づきましたか?— OPは、彼の最初のアプローチを機能させる方法を学びました。
G-Manは「Reinstate Monica」と言います

2
応答を否定的に評価するのはなぜですか?:/
オルシウス

3
素晴らしい答え。正規表現ORがあり、-vEオプションが役に立ちました。
カートカーソン

3
これは、ほとんどの人がおそらく解決しようとしている質問に対する答えです。
Perfi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.