ログファイルの末尾を表示しますが、特定の行のみを表示します


29

ログファイルの末尾に-fフラグを付けています。次に、これをgrepにパイプして、「X」を含む行のみを検索します。それは完全にうまく機能しています。次に、これを別のgrepに再度パイプします。これにより、「Y」を含むすべての行が削除されます。2番目のパイプを追加すると、ファイルの更新が停止し、データが到着していないように見えます。

これは機能するコマンドです: tail -f my_file.log | grep "X"

これはしないコマンドです: tail -f my_file.log | grep "X" | grep -v "Y"

コマンドが機能するようにこれをどのように構成する必要がありますか?


1
1つのパイプで1つのパイプを実行し、シーケンスを変更して、doを実行しますtail -f file|grep -v "Y"。出力に問題がなければ、追加に進みますgrep "X"
Aizuddinザリ

回答:


38

の出力grepはバッファリングされるので、--line-bufferedオプションを使用してgrep行バッファリングを有効にします。

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

grepオプションがない場合はstdbuf、代わりに使用できます:

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
私はどのように疑問に思ってstdbuf伝えlibstdbuf.soた設定を使用します。
カスペルド

@kasperd:環境変数。
ネイト・エルドレッジ

1
@NateEldredgeからの出力で環境変数を探しdiff -u <(env) <(stdbuf env)ましたが、どれも見つかりませんでした。しかし、今、私は私がテストするべきだったことがわかったdiff -u <(env) <(stdbuf -oL env)
カスペルド

私も同じような問題です。私の場合は、「aaa」と「bbb」を含むすべての行を印刷する必要があります。上記の最初のソリューションが機能しません。2番目のソリューションは、「aaa」が存在し、「bbb」が存在しない場合に機能します。両方とも機能していません。出力しません。私のコマンドは次のようになります: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' 出力を提供しません。手伝っていただけませんか。

18

私は通常awk、これらの種類の論理チェックにはより便利だと感じています。

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

2つのタブを使用してテストしました。1つは書き込みを続けseq 20 >> myfile、もう1つはを持っていますtail -f myfile | awk '/3/ && !/13/'


15

別のアプローチはgrep、2回ではなく1回の呼び出しを使用して、バッファリングの問題を回避することです。0個以上のY以外の文字で構成される行に一致する正規表現を使用し、次にX、次に行の終わりまで0個以上のY以外の文字を再度使用します。

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.