次のようにファイルを追跡すると:
tail -f /var/log/syslog|grep s
「s」を含むすべての行が表示されます。
再び同じ「s」にgrepすると、なぜ出力が出ないのですか?
tail -f /var/log/syslog|grep s|grep s
答え1
--line-buffered
Rubo77が述べたように、最初のgrepコマンドに次のコマンドを追加すると問題を解決できます。
tail -f /var/log/syslog|grep --line-buffered s|grep s
grep
しかし、なぜ単一のコマンドでこれを行う必要はありませんか?この2つの違いは次のコマンドです。
tail -f /var/log/syslog|grep s
STDOUT
端末のgrepポイントの場合。ほとんどの書き込み操作はstdioライブラリに含まれている関数を介して行われますgrep
。STDOUT
文書によると(標準入出力(3)):
デフォルトでは、端末デバイスを参照する出力ストリームは常にラインバッファリングされます。
したがって、デフォルトのライブラリ呼び出しは各行の後にバッファをフラッシュしますが、grepは何もしません。
このコマンドでは:
tail -f /var/log/syslog|grep --line-buffered s|grep s
STDIO
ターミナルデバイスの代わりにパイプを入力し、STDOUTに書き込むためのgrepのライブラリ関数は、ラインバッファリングを使用する代わりにこれらの書き込みを完全にバッファリングします。--line-buffered
このフラグを使用すると、grepが呼び出され、バッファリングされたすべての書き込みがfflush
フラッシュされます。
答え2
--line-buffered
grepに追加する必要があります
tail -f /var/log/syslog|grep --line-buffered s|grep s