私が言うとき、私はsedがブロックしていないという印象を持っていました:
iostat | sed
sed
到着時にデータを処理しますが、
iostat | sed | netcat
次にsed
ブロックしnetcat
ます。
私は正しいですか?
sed
端末に出力しない場合は、バッファ モードで動作します。これは、デフォルトで処理と出力を行う前に内部バッファを埋めようとすることを意味します。
これは、スループットを向上させるために行われます。通常、パイプではタイミングは気にしませんが、特定の時間内にできるだけ多くのデータを処理したいからです。
sed に渡す-u
と、バッファなしで動作するように指示されるため、出力が端末に送られるときと同じように動作します。
@sauaが言うことに加えて、sed
少なくとも行指向であり、行を読み取ってから操作するため、常に少なくとも1行をバッファリングします。さらに、sed
複数行モードで作業できます。複数行のパターンを使用しているsed
場合、パターンが適用されないか、パターンが処理されていることがわかるまで、現在のバッファーを出力できません。
質問を正しく理解しているかどうかはわかりませんが、あなたの例では次のようになります。
それ以外では、sed は出力を生成するためにすべての入力を読み取る必要はありません。
これといくつかの小さなバッファリングでは説明できない遅延が見られますか?