2009-02-23 21 views
6

私はsedの印象は、私が言うときので、ブロックされなかった持っていた。それが到着するようsedがブロックされていますか?

iostat | sed 

sedは、データを処理し、私はその後sedブロックnetcat

iostat | sed | netcat 

を行うとき。

私は正しいですか?

答えて

14

sedは端末に印刷しないときはバッファモードで動作します。これは、デフォルトで何らかの処理と出力を行う前に内部バッファを埋めるように試みることを意味します。

これは、パイプ内で通常タイミングを気にせず、できるだけ多くのデータを所定の時間内に処理したいので、スループットを向上させるために行われます。

をsedに渡すと、バッファされていない状態で動作するようになり、出力が端末に送られたときと同じように動作します。

+0

:不正なオプション - U – CommaToast

+0

@CommaToast:その後のsedのあなたの味は同等のオプションを持っている場合はGNUのsedのかを知る使用するか(と、ここでそれを投稿します答え、あなたがするとき)。 –

+0

私のMacOSX compでは、 '-u'はありませんが' -l'は行バッファリングのために働きます。 – Umbrella

1

私は右の質問を理解している場合、私は知らないが、あなたの例では、それはこのようにする必要があります。プロセスにsedのを待ちますiostatのデータ

  • を送信するためのiostatのため

    • sedのを待ちデータを送信するためにsedのため場合は、sedのデータは
    • のnetcatを待ち遅い
    • はそれが遅い場合には、再度のnetcatを待つことになるsedの

    それ以外の場合、sedは出力を生成するためにすべての入力を読む必要はありません。

    これといくつかの小さなバッファリングでは説明できない遅延がありますか?

  • 3

    @sauaに加えて、sedは少なくとも行指向であるため、行を読み込んでから操作して、常に少なくとも1行をバッファリングします。さらに、sedは複数行モードでも動作します。複数のパターンを使用している場合、sedは、パターンが適用されないか、またはパターンが処理されたことがわかるまで、現在のバッファを出力できません。

    0

    stdbufは、標準IOストリームのバッファリング動作の変更を支援できます。あなたは、バッファリング動作を変更するにはこれを試すことができます。

    sedの
    ... | stdbuf -oL -eL sed -e ... | ... 
    
    関連する問題