2009-02-23 16 views
6

Ich hatte die sed Eindruck nicht versperrte, weil, wenn ich sage ich:Wird sed blockiert?

iostat | sed 

sed verarbeitet die Daten, wie es kommt, aber wenn ich tun

iostat | sed | netcat 

Dann sed Blöcke netcat.

Bin ich richtig?

Antwort

14

sed funktioniert im gepufferten Modus, wenn nicht an ein Terminal gedruckt wird. Dies bedeutet, dass es versuchen wird, seinen internen Puffer zu füllen, bevor es verarbeitet und standardmäßig ausgegeben wird.

Dies wird getan, um den Durchsatz zu erhöhen, weil normalerweise in einer Pipe Sie nicht um das Timing kümmern, aber so viel Daten in einer gegebenen Zeit wie möglich verarbeiten möchten.

Übergeben -u zu sed wird sagen, dass es ungepuffert funktioniert, daher funktioniert es genauso, wie es funktioniert, wenn die Ausgabe an ein Terminal geht.

+0

sed: illegale Option - u – CommaToast

+0

@CommaToast: dann entweder verwenden GNU sed oder herauszufinden, ob Ihr Geschmack von sed eine gleichwertige Option hat (und per Post hier als eine Antwort, wenn Sie es tun). –

+0

Auf meiner MacOSX-Comp fehlt '-u', aber' -l' funktioniert für die Zeilenpufferung, was bevorzugt wird. – Umbrella

1

Ich weiß nicht, ob ich die Frage richtig verstanden, aber in Ihrem Beispiel sollte es so aussehen:

  • sed wartet auf iostat Daten senden
  • iostat zu Prozess sed warten die Daten sed wenn langsam
  • netcat wartet sed Daten senden
  • wieder für netcat warten sed wird, wenn es langsam
  • ist

Darüber hinaus sollte sed nicht alle Eingaben lesen müssen, um die Ausgabe zu erzeugen.

Beobachten Sie Verzögerungen, die nicht mit dieser kleinen Pufferung erklärt werden können?

3

Zusätzlich zu dem, was @Saua sagt, sed ist mindestens Linie orientiert, dass es, es liest eine Zeile, dann funktioniert es auf, so wird es immer mindestens eine Zeile puffern. Außerdem kann sed im Mehrzeilenmodus arbeiten. Wenn Sie ein mehrzeiliges Muster verwenden, kann sed den aktuellen Puffer nicht ausgeben, bis es weiß, dass das Muster nicht gilt oder das Muster verarbeitet wurde.

0

stdbuf kann helfen, das Pufferverhalten der Standard-Io-Streams zu ändern. Sie können dies versuchen, die Pufferung Verhalten zu ändern:

... | stdbuf -oL -eL sed -e ... | ...