grepへの出力リダイレクトが期待どおりに機能しません。

grepへの出力リダイレクトが期待どおりに機能しません。

管路

sudo ngrep -W byline -qilw 'get' tcp dst port 80 | grep -i ".*" |tee /tmp/output

または

sudo ngrep -W byline -qilw 'get' tcp dst port 80 | grep -i ".*" > /tmp/output

/tmp/outputHTTP GETリクエストを実行すると、何も記録されません。

リダイレクトせずにstdoutからいくつかの出力を取得できます。なぜ?

答え1

grepユーティリティが端末に接続されていない場合は、出力をバッファリングします。出力バッファがいっぱいになってフラッシュされる/tmp/outputまで、ファイルに出力は表示されません。grep

実行される限り、ngrepこれは問題になります。終了ngrepすると、grep出力バッファは終了前にフラッシュされます。

このバッファリングはパフォーマンス上の理由で行われます。 1行のテキストを出力にフラッシュするには短い時間がかかりますが、大量のデータが含まれているとパイプラインが遅くなる可能性があります。

バッファリングをオフにしたりgrep、ラインバッファリングを有効にしたりできます。 BSDとGNUの場合、grepこれは非標準オプションを使用して行われる--line-bufferedため、次の利点があります。

sudo ngrep -W byline -qilw get tcp dst port 80 |
grep --line-buffered -i '.*' |
tee /tmp/output

grepあるいは、すべての行を通過するので、完全に削除できますngreptee正規表現は空であるかどうかにかかわら.*ず、すべての行で一致します)。

関連情報