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?
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?
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.
Ich weiß nicht, ob ich die Frage richtig verstanden, aber in Ihrem Beispiel sollte es so aussehen:
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?
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.
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 ... | ...
sed: illegale Option - u – CommaToast
@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). –
Auf meiner MacOSX-Comp fehlt '-u', aber' -l' funktioniert für die Zeilenpufferung, was bevorzugt wird. – Umbrella