連続したストリームでgrep
を使うことは可能ですか?
私が意味しているのは一種のtail -f <file>
コマンドですが、私の興味を引く行だけを保持するために出力にgrep
を付けています。
私はtail -f <file> | grep pattern
を試しましたが、grep
はtail
が終了した後でなければ実行できないようです。
BSD grep(FreeBSD、Mac OS Xなど)を使うときはgrep
のラインバッファリングモードをオンにします。
tail -f file | grep --line-buffered my_pattern
GNU grep(ほとんどすべてのLinuxで使用されています)はデフォルトでフラッシュするので、これを行う必要はありません(SmartOS、AIX、QNXなどの他のUnix系の場合はYMMV)。
私はtail -f <file> | grep <pattern>
をいつも使っています。
Grepがフラッシュするまで待って、それが終わるまで待ちません(私はUbuntuを使っています)。
私はあなたの問題はgrepが出力バッファリングを使用していることだと思います。試します
tail -f file | stdbuf -o0 grep my_pattern
grepの出力バッファリングモードをunbufferedに設定します。
ほとんどの場合、あなたは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
全体 ファイル(末尾だけでなく)で一致を見つけたい場合、それを座って新しい一致を待つ必要がある場合、これはうまく機能します。
tail -c +0 -f <file> | grep --line-buffered <pattern>
-c +0
フラグは、出力がファイルの先頭(0
)から-c
バイト(+
)で始まるように指定します。
誰もがこれのために私のいつものやり方を提供するのを見ませんでした:
less +F <file>
ctrl + c
/<search term>
<enter>
shift + f
ctrl + c
を使用していつでもファイルを停止してナビゲートすることができ、ライブストリーミング検索に戻るにはshift + f
を押すだけで済みます。
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になります。
あなたはこの答えを機能強化と考えているかもしれません。
tail -F <fileName> | grep --line-buffered <pattern> -A 3 -B 5
ファイルローテーションの場合は-Fが優れています(ファイルローテーションの場合は-fは正しく機能しません)。
-Aと-Bは、パターン発生の直前と直後の行を取得するのに便利です。これらのブロックは、破線の区切り文字の間に表示されます。
この1つのコマンドは私のために働きます(Suse):
mail-srv:/var/log # tail -f /var/log/mail.info |grep --line-buffered LOGIN >> logins_to_mail
メールサービスへのログインを収集する
はい、これは実際にはうまくいきます。 Grep
およびほとんどのUnixコマンドは一度に1行ずつストリームを操作します。末尾から出てくる各行が分析され、一致する場合は渡されます。