管路
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/output
HTTP 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
あるいは、すべての行を通過するので、完全に削除できますngrep
(tee
正規表現は空であるかどうかにかかわら.*
ず、すべての行で一致します)。