web-dev-qa-db-ja.com

grepとtail -f?

tail -f(または類似の)ファイル、およびgrepを同時に?そのような動作を探すだけの他のコマンドを気にしません。

30
xenoterracide

GNU tailおよびGNU grepを使用すると、tail -f簡単な構文を使用します。

tail -f /var/log/file.log | grep search_term
48
Steven D

追加 --line-bufferedからgrepに変更すると、遅延が減少する可能性があります。場合によっては非常に役立ちます。

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

正常に動作します。より一般的には、grepはプログラムが出力していないときに待機し、出力が来ても読み続けます。

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

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

7
Michael Mrozek

単に grepの出力をtail -f)にパイプすることができますtail -f機能とフィルタリングおよびカラーリングを組み合わせたプログラムもあります。特に multitailexamples )です。

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

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

これは、GNU tailおよびgrepを前提としています。tailマンページからのサポート詳細(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に相当します。最後の引数は、コマンドを開始してゼロ行をスキップするように指示します。

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

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

1
user4553

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

0
mouviciel

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

これにより、ポート1337からの入力の結果をリッスンするようにgrepが設定されます。
2番目のコマンドは、tail -fの出力をnetcatにパイプし、localhost 1337に送信します。ローカルで実行するには、2つのコマンドセットそれぞれのttyを切り替えるか、screenなどを使用する必要があります。

0
Justin S