web-dev-qa-db-ja.com

tail -fで、特定のキーワードを含むものをどのようにフィルタリングしますか?

したい tail -f私のログ。ただし、次の単語が含まれるものはすべて除外します。

「ELB」、「Pingdom」、「Health」

39
Alex

Grepの代わりにawkを使用することについては知りませんが、これは私にとってはうまくいきます:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

EDIT:dmourati および Caleb が指摘したように、grep -Eの代わりにegrepを使用することもできます便利。一部のシステムでは、これは同じバイナリへのリンクになります。他のシステムでは、grepパッケージによって提供されるそのコピーです。どちらにしても、-Eスイッチの代わりとして機能します。ただし、GNU grepのmanページによると、

[…] 2つのバリアントプログラムegrepおよびfgrepを使用できます。 egrepgrep -Eと同じです。 fgrepgrep -Fと同じです。 egrepまたはfgrepとしての直接呼び出しは非推奨ですが、それらに依存する履歴アプリケーションを変更せずに実行できるようにするために提供されています。

これらは同義のコマンドであるため、egrepがまったくない場合を除き、優先順位が高くなります。ただし、他のメソッドは正式に廃止されているため、上位互換性のためにgrep -E構文を使用することをお勧めします。

58
DTest

除外したい単語のリストをパイプで区切ってegrepにパイプしてみてください:

_tail -f log_file | egrep -v 'ELB|Pingdom|Health'
_

一致のリストを括弧で囲むことはオプションであることに注意してください。 _|_は、サブグループの一部として発生するかどうかに関係なく、grepでは論理OR演算子として扱われるため、'(ELB|Pingdom|Health)'はまったく同じように機能します。 。一部の人にとっては、構文はより明白かもしれません;括弧を追加するために戻ることなく、単一の一致から可能な一致のリストに切り替えることができるため、入力せずに入力する方が簡単です。

追加のクレジットとして、multitailが出力のフィルタリングに関して忍者fooを実行することは言及する価値があります。たとえば、次のように単語をフィルタリングできます。

_multitail -e ELB -e Pingdom -e Health -f log_file
_

また、単にフィルタリングするのではなく、出力を色付けしたりハイライトしたりするために使用することもできます。

EDit:DTests answer およびコメントを参照して、egrepが非推奨の代替手段として起動する方法の完全な説明について_grep -E_。

21
Caleb
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
5
dmourati

なぜこの情報を記録したいのですか?

  • 厳密にアーカイブ用ですか?
  • ログファイルの異なるキーワードまたはパターンに応じて、異なるスクリプトを条件付きで実行しますか?

ログファイルの内容に応じてスクリプト化された動作が必要な場合は、Expectを使用してフィルタリングを行うことができます。 ( http://en.wikipedia.org/wiki/Expect )ExpectはTcl拡張ですが、Python Expectのバージョンもあります。

Expectは、この強力な柔軟なスイッチのようなステートメントを提供します。これにより、入力ストリームに存在する状態やパターンに応じて、条件に応じて異なる動作を指定できます。例えば:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

したがって、expectステートメントでパターンを指定し、さまざまな動作を指定して、全体をループでラップできます。また、入力の一部をさまざまなファイルに書き込む非常に強力なフィルターを簡単に作成したり、完全にドロップしたりできます。または、入力内容に応じてアクションを実行し、他のスクリプトを実行します。

それでは、なぜログファイルをフィルタリングしようとしているのか、ログ入力に対してアクションを実行しようとしているのか、それとも単にアーカイブ上の理由のためなのでしょうか。

3
Jerry Asher