grepとtail -f?


28

tail -fファイルに対して(または同様の)処理を行うことはできますgrepか?他のコマンドがそのような動作を探しているだけでもかまいません。

回答:


46

GNU tailとGNU を使用すると、単純な構文を使用grepしてgrepを実行できtail -fます。

tail -f /var/log/file.log | grep search_term

これは、GNU実装だけでなく、これら2つのユーティリティの他の実装でも機能するソリューションです。
クサラナナンダ

7

それはうまくいきます。より一般的にgrepは、プログラムが出力されていないときに待機し、出力が入ってくると読み続けます。

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

5秒間何も起こらない場合、grepは一致した「テスト」を出力し、5秒後にパイプされたプロセスが終了すると終了します。


7

に追加--line-bufferedするgrepと、遅延が減少する場合があります。場合によっては非常に便利です。

tail -f foo | grep --line-buffered bar

2
これは、の出力がgrep端末に送られない場合(別の種類のファイルにリダイレクトされる場合)に便利です。出力が端末に送られるときのデフォルトは行バッファリングなので、そこでは何の違いも生じません。このオプションはGNU固有のものであることに注意してください。
ステファンシャゼル


2

これらすべての人々がを使用するようtail -fに言っているのを見ますが、その制限が好きではありません!新しい行も見ながらファイルを検索する私のお気に入りの方法(たとえば、cronジョブを介して定期的に実行されるプロセスのリダイレクトされた出力が追加されるログファイルを通常使用します):

 tail -Fn+0 /path/to/file|grep searchterm

これは、GNU tailとgrepを想定しています。テールのマンページ(GNU coreutils、私のv8.22)からの詳細のサポート[ https://www.gnu.org/software/coreutils/manual/coreutils.html]

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

したがって、私のコマンドの末尾部分はに等しくtail --follow --retry --lines=+0、最後の引数はゼロ行をスキップして先頭から開始するように指示します。


1
tail -f access | awk '/ADD/{print $0}'

上記を使用して、私は通常それを使用します。


0

netcatを使用して、tail -fの結果をgrepすることができます。新しい結果が非常に簡単に届くからです。

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

これにより、grepがポート1337からの入力の結果をリッスンするように設定されます。2
番目のコマンドは、tail -fの出力をnetcatにパイプし、ローカルホスト1337に送信します。 、または画面のようなものを使用します。


0

できます。ただし、出力は瞬時ではなく、パイプを介してバッファリングされることに注意してください。


同意した。これをテストするには、2つのウィンドウを開きます。tail -f1つのウィンドウで実行しtail -f logfile | grep pattern、別のウィンドウで実行します。を含む行がpattern両方のウィンドウに同時に表示されるとは限りません。まれに30秒間隔で行が表示されることがありますが、これは迷惑です。
ステファンLasiewski

それは、尾の1つまたは他のインスタンスを実行する間でシステムが反転することと関係があるかもしれません。より良いテストは、私たちteeか何かでしょう。
ケビンCantu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.