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 .

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.


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)

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


-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 ...


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.