tail -f の二重 grep は出力を提供しません。

tail -f の二重 grep は出力を提供しません。

次のようにファイルを追跡すると:

tail -f  /var/log/syslog|grep s

「s」を含むすべての行が表示されます。

再び同じ「s」にgrepすると、なぜ出力が出ないのですか?

tail -f  /var/log/syslog|grep s|grep s

ベストアンサー1

--line-bufferedRubo77が述べたように、最初のgrepコマンドに次のコマンドを追加すると問題を解決できます。

tail -f  /var/log/syslog|grep --line-buffered s|grep s

grepしかし、なぜ単一のコマンドでこれを行う必要はありませんか?この2つの違いは次のコマンドです。

tail -f  /var/log/syslog|grep s

STDOUT端末のgrepポイントの場合。ほとんどの書き込み操作はstdioライブラリに含まれている関数を介して行われますgrepSTDOUT文書によると(標準入出力(3)):

デフォルトでは、端末デバイスを参照する出力ストリームは常にラインバッファリングされます。

したがって、デフォルトのライブラリ呼び出しは各行の後にバッファをフラッシュしますが、grepは何もしません。

このコマンドでは:

tail -f  /var/log/syslog|grep --line-buffered s|grep s

STDIOターミナルデバイスの代わりにパイプを入力し、STDOUTに書き込むためのgrepのライブラリ関数は、ラインバッファリングを使用する代わりにこれらの書き込みを完全にバッファリングします。--line-bufferedこのフラグを使用すると、grepが呼び出され、バッファリングされたすべての書き込みがfflushフラッシュされます。

おすすめ記事