2016-04-24 12 views
0

unerwartet versagt diese (keine Ausgabe, versuchte in sh, zsh, bash):Warum kann ich die Tail-Ausgabe nicht mehrfach durch Pipes filtern?

echo "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | sed 's#pl#st#g'

Beachten Sie, dass zwei mal grep versagt auch angibt, dass es recht ist irrelevant welche Befehle verwendet werden:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | grep played 

grep allein Werke:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played 
played 

sed allein Werke:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | sed 's#pl#st#g'` 
foo 
stayed 
bar 

Mit Katze statt Schwanz, es funktioniert:

# echo -e "foo\nplayed\nbar" > /tmp/t && cat /tmp/t | grep played | sed 's#pl#st#g' 
stayed 

Mit journalctl --follow, es scheitert genau wie bei tail.

Was ist der Grund dafür, dass es nicht möglich ist, zweimal zu pipen?

Antwort

1

Es ist ein Pufferungsproblem - der erste Grep puffert seine Ausgabe, wenn es zu einem anderen Befehl führt, aber nicht, wenn es auf stdout druckt. Weitere Informationen finden Sie unter http://mywiki.wooledge.org/BashFAQ/009.

+0

Danke, Ed. Der Artikel schlägt vor, zuerst zu überprüfen, ob unnötige Befehle vorhanden sind, die möglicherweise beseitigt werden. In meinem speziellen Fall war es mir möglich, '--silent' hinzuzufügen und explizit die substituierten Zeilen (' p') zu drucken. ZB 'sed --silent 's # pl # st # p''. (Sonst wären die erwähnten * ungepufferten * Varianten der richtige Weg gewesen.) – user569825

+0

Ich habe noch nie von '--silent' gehört, es sieht genauso aus wie das üblichere' -n'. Das wird Zeilen drucken, die "pl" in einem anderen Kontext als "gespielt" enthalten. Sie können Dinge wie '/ played/{s/pl/st/gp}' mit sed tun, aber überprüfen Sie die Syntax. In awk wäre es "awk"/gespielt/{gsub (/ pl /, "st"); print} ''. –

+0

Glücklicherweise ist mein Anwendungsfall komplexer als das Beispiel, das ich angegeben habe. Daher ist jede Zeile, die Substitutionen empfängt, tatsächlich in der Ausgabe erwünscht. Für zukünftige Fälle wäre ich dennoch neugierig auf die korrekte Syntax von sed. (Btw '--silent' * ist *' -n'. Ich bevorzuge nur die aufwendigen Varianten von Switches beim Scripten und Dokumentieren.) – user569825