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?
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
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} ''. –
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