web-dev-qa-db-ja.com

連続したストリームを 'grep'するにはどうすればいいですか?

連続したストリームでgrepを使うことは可能ですか?

私が意味しているのは一種のtail -f <file>コマンドですが、私の興味を引く行だけを保持するために出力にgrepを付けています。

私はtail -f <file> | grep patternを試しましたが、greptailが終了した後でなければ実行できないようです。

638
Matthieu Napoli

BSD grep(FreeBSD、Mac OS Xなど)を使うときはgrepのラインバッファリングモードをオンにします。

tail -f file | grep --line-buffered my_pattern

GNU grep(ほとんどすべてのLinuxで使用されています)はデフォルトでフラッシュするので、これを行う必要はありません(SmartOS、AIX、QNXなどの他のUnix系の場合はYMMV)。

1190
tad

私はtail -f <file> | grep <pattern>をいつも使っています。

Grepがフラッシュするまで待って、それが終わるまで待ちません(私はUbuntuを使っています)。

113
Irit Katriel

私はあなたの問題はgrepが出力バッファリングを使用していることだと思います。試します

tail -f file | stdbuf -o0 grep my_pattern

grepの出力バッファリングモードをunbufferedに設定します。

56
XzKto

ほとんどの場合、あなたはtail -f /var/log/some.log |grep fooを実行することができ、それはうまく動作します。

実行中のログファイルに複数のgrepsを使用する必要があり、何も出力されないことがわかった場合は、次のように--line-bufferedスイッチを middle grepに固定する必要があります。

tail -f /var/log/some.log | grep --line-buffered foo | grep bar
10
Dale Anderson

全体 ファイル(末尾だけでなく)で一致を見つけたい場合、それを座って新しい一致を待つ必要がある場合、これはうまく機能します。

tail -c +0 -f <file> | grep --line-buffered <pattern>

-c +0フラグは、出力がファイルの先頭(0)から-cバイト(+)で始まるように指定します。

9
Ken Williams

誰もがこれのために私のいつものやり方を提供するのを見ませんでした:

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

ctrl + cを使用していつでもファイルを停止してナビゲートすることができ、ライブストリーミング検索に戻るにはshift + fを押すだけで済みます。

5
Hans.Loven.work

sed のほうが良いでしょう( stream editor)

tail -n0 -f <file> | sed -n '/search string/p'

そして、特定の文字列を見つけたらtailコマンドを終了させたい場合は、

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

明らかにバシズム:$ BASHPIDはtailコマンドのプロセスIDになります。 sedコマンドはパイプ内の末尾の次にあるので、sedプロセスIDは$ BASHPID + 1になります。

3
Christian Herr

あなたはこの答えを機能強化と考えているかもしれません。

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

ファイルローテーションの場合は-Fが優れています(ファイルローテーションの場合は-fは正しく機能しません)。

-Aと-Bは、パターン発生の直前と直後の行を取得するのに便利です。これらのブロックは、破線の区切り文字の間に表示されます。

2
mebada

この1つのコマンドは私のために働きます(Suse):

mail-srv:/var/log # tail -f /var/log/mail.info |grep --line-buffered LOGIN  >> logins_to_mail

メールサービスへのログインを収集する

1
user10584393

はい、これは実際にはうまくいきます。 GrepおよびほとんどのUnixコマンドは一度に1行ずつストリームを操作します。末尾から出てくる各行が分析され、一致する場合は渡されます。

0
Caleb