ログファイルを tail して特定の行のみを表示する

ログファイルを tail して特定の行のみを表示する

-f フラグを使用してログ ファイルを tail しています。次に、これを grep にパイプして、「X」を含む行だけを検索します。これで問題なく動作します。次に、これを別の grep にパイプして、「Y」を含む行をすべて削除します。2 番目のパイプを追加すると、ファイルの更新が停止し、データが何も来ていないように見えます。

機能するコマンドは次のとおりです: tail -f my_file.log | grep "X"

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

コマンドが機能するようにこれをどのように構成すればよいでしょうか?

答え1

の出力は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'

答え2

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/'

答え3

別の方法としては、2 回ではなく 1 回のgrep呼び出しを使用して、バッファリングの問題を回避することです。行末まで、0 個以上の非 Y 文字、次に X、そして再び 0 個以上の非 Y 文字で構成される行に一致する正規表現を使用するだけです。

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'

関連情報