Ausgabe nach stdout und gleichzeitig grep in eine Datei

18

Ich habe ein Skript, das Text ausgibt stdout. Ich möchte all diese Ausgaben in meinem Terminal sehen und gleichzeitig einige Zeilen filtern und in einer Datei speichern. Beispiel:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

Ich möchte die Ausgabe des ersten Befehls im Terminal sehen und die Ausgabe des zweiten Befehls in einer Datei speichern. Gleichzeitig. Ich habe versucht, mit tee, aber ohne Ergebnis oder besser mit umgekehrtem Ergebnis .

Lorenzo-s
quelle

Antworten:

27

Ich möchte die Ausgabe des ersten Befehls im Terminal sehen und die Ausgabe des zweiten Befehls in einer Datei speichern.

Solange es Ihnen egal ist, ob das, was Sie ansehen , von stdout oder stderr stammt , können Sie weiterhin Folgendes verwenden tee:

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

Funktioniert unter Linux; Ich weiß nicht, ob "/ dev / stderr" auch für andere * Nixe gilt.

Goldlöckchen
quelle
9
/dev/stderrist üblich. /dev/tty(was bedeutet, das aktuelle Terminal) würde auch hier funktionieren, und es ist Standard .
Gilles 'SO- hör auf böse zu sein'
@ Gilles: Wunderbar. tee /dev/ttydiente wunderbar für meine Anforderung, das stdoutvon einem Skript zum Terminal zu drucken und es auch zu dem stdinvon einem anderen Befehl weiterzuleiten! Danke! :-)
Jamadagni
8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

Oder mit Prozessersetzung (ksh93, zsh oder bash):

... | tee >(grep -e A -e C > out.file)

Mit zsh:

... >&1 > >(grep -e A -e C > out.file)
Stéphane Chazelas
quelle
Ich musste den ersten verwenden, da der Exit-Code von grep erhalten bleibt. Auch, wenn Sie aus irgendeinem Grund nicht das / dev - Dateisystem zugreifen können, die /dev/fd/3ersetzt werden kann>(cat 1>&3)
golvok
4

Hier ist ein anderer Weg mit sed:

myscript | sed '/PATTERN/w out.file'

Standardmäßig seddruckt jede Zeile so in diesem Fall stdout wird das gleiche sein wie stdin (dh Sie werden die gesamte Produktion von sehen myscriptauf dem Bildschirm).
Darüber hinaus werden alle Linien Anpassung PATTERNwird wzu Rittenout.file

don_crissti
quelle
-1

Sie haben nicht angegeben, wie Sie den Befehl tee verwendet haben, aber dies sollte funktionieren:

myscript | grep -P 'A|C' | tee out.file

Zumindest hat es vor ein paar Minuten auf meinem Server funktioniert ...

MelBurslan
quelle
4
Aber wenn ich mich nicht irre, greifst du auf diese Weise auch über das, was auf dem Bildschirm zu sehen ist. Ich möchte alle Ausgaben auf dem Bildschirm sehen und nur filtern, was in die Datei fließt.
Lorenzo-s