あなたの問題は、grepが出力バッファリングを使用していることだと思います。試してみてください
tail -f file | stdbuf -o0 grep my_pattern
grep の出力バッファリング モードを unbuffered に設定します。
grep
をオンにする BSD grep 使用時の行バッファリング モード (FreeBSD、Mac OS X など)
tail -f file | grep --line-buffered my_pattern
--line-buffered
少し前のようです デフォルトでフラッシュされるため、GNU grep(ほぼすべてのLinuxで使用)には問題ありませんでした(SmartOS、AIX、QNXなどの他のUnixライクのYMMV)。ただし、2020 年 11 月現在、--line-buffered
が必要です (少なくとも openSUSE の GNU grep 3.5 では必要ですが、以下のコメントに基づいて一般的に必要と思われます)。
tail -f <file> | grep <pattern>
を使用します
終了するまでではなく、grep がフラッシュするまで待機します (私は Ubuntu を使用しています)。
全体で一致を見つけたい場合 ファイル (テールだけでなく) を作成し、新しい一致を待つようにしたい場合、これはうまく機能します:
tail -c +0 -f <file> | grep --line-buffered <pattern>
-c +0
フラグは、出力が 0
で始まる必要があることを示しています バイト (-c
) 最初から (+
) ファイルの。