2013-05-01 9 views

Antwort

13

Verwenden Sie die folgende Pipeline, wenn nur Nachrichten ERROR enthalten, sollten auf der Konsole (Stderr) dargestellt werden:

stm |& grep ERROR | tee -a /path/to/logfile 

Mit dem folgenden Befehl, wenn alle Meldungen auf der Konsole (Stderr) angezeigt werden sollen:

stm |& tee /dev/stderr | grep ERROR >> /path/to/logfile 

Edit: Versionen ohne die Standardausgabe und Standardfehler Verbindungs:

stm 2> >(grep --line-buffered ERROR | tee -a /path/to/logfile >&2) 
stm 2> >(tee /dev/stderr | grep --line-buffered ERROR >> /path/to/logfile) 
+6

'| &' verbinden sowohl Standardausgabe als auch Standardfehler mit dem RHS der Pipeline. – chepner

+0

stm | & grep ERROR scheint die Meldungen mit ERROR zur Konsole herauszufiltern, aber aus irgendeinem Grund scheint das Abschlagen in das Logfile immer eine leere Datei zurückzugeben, auch wenn ich es nicht auf der Konsole haben möchte, stm | & grep ERROR > logfile.txt funktioniert nicht. – user2339933

1

Das sieht wie ein Duplikat How to pipe stderr, and not stdout?

Redirect stderr "& 1", die "der gleiche Ort, an dem stdout wird" bedeutet. Dann leiten Sie stdout an/dev/null um. Dann benutze ein normales Rohr.

Um die Ausgabe des obigen Befehls in eine Datei zu kopieren, können Sie eine> Umleitung oder "Tee" verwenden. Der Befehl tee gibt eine Kopie der Ausgabe an die Konsole und eine zweite Kopie an die Datei aus.

$ stm 2>&1 >/dev/null | grep ERROR > errors.txt 

oder

$ stm 2>&1 >/dev/null | grep ERROR | tee errors.txt 
+0

Es ist fast das gleiche wie die Frage von Piping stderr und grepping darauf.Ich möchte nur die Grepped-Ausgabe in eine Protokolldatei.Ich bin nicht einmal besorgt über die Ausgabe auf der Konsole so viel.Für manche Gründe./stm | & grep FEHLER >> log.txt erstellt eine leere Protokolldatei, obwohl ohne die Umleitung zur Protokolldatei die Konsole auf dem Bildschirm ausgegeben wird. – user2339933

0

Wollen Sie damit sagen, dass Sie beide stderr und stdout wollen in der Konsole erscheinen, aber nur stderr (nicht stdout), die „ERROR“ angemeldet sein, um eine Datei enthält? Es ist diese letzte Bedingung, die es schwierig macht, eine elegante Lösung zu finden. Wenn das ist, was Sie suchen, hier ist meine sehr hässlich Lösung:

touch stm.out stm.err 
stm 1>stm.out 2>stm.err & tail -f stm.out & tail -f stm.err & \ 
wait `pgrep stm`; pkill tail; grep ERROR stm.err > error.log; rm stm.err stm.out 

ich gewarnt Sie es hässlich zu sein. Sie könnten es in einer Funktion verstecken, mktemp verwenden, um die temporären Dateinamen zu erstellen, usw. Wenn Sie nicht warten wollen, bis stm beendet wird, bevor Sie den FEHLER-Text in eine Datei protokollieren, können Sie tail -f stm.err | grep ERROR > error.log & nach den anderen Tail-Befehlen hinzufügen Entferne den Befehl grep aus der letzten Zeile.

+0

Eigentlich ist die Anforderung zur Anzeige auf der Konsole nicht kritisch.Ich möchte nur hauptsächlich stderr grep und log es auf eine Textdatei.Ich mache ./stm | & grep FEHLER >> log.txt, aber ich bekomme nichts o die Textdatei. Wenn ich ./stm|& Grep FEHLER führe, erhalte ich die gefilterten Nachrichten auf der Konsole. – user2339933

Verwandte Themen