あなたの問題は、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 ) 最初から (+ ) ファイルの。