2012-04-10 9 views
1

Gibt es eine Möglichkeit, stdout (oder stderr) zu filtern, bevor es in eine Datei umgeleitet wird? "Umleiten zu einer Pfeife" ist wahrscheinlich nicht der beste Weg, um es zu setzen, aber ich suche nach dem einfachsten Weg, etwas mit diesem Effekt zu erreichen.In eine Pipe umleiten

Das Verwendungsszenario ist das folgende. Ich benutze gawk --lint-invalid grundsätzlich, um mögliche Fehler in meinen Skripten zu erkennen und falsche zu filtern. Anstatt Fehler in eine Datei umzuleiten und sie beim Untersuchen der Datei auszublenden, möchte ich, dass die Filterung vor dem Schreiben in die Datei stattfindet.

Beispiel: Dieses Skript druckt jede zweite Zeile nach stderr.

echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid 'BEGIN {b = 1;} // {if (b) print; else print > "/dev/stderr"; b = !b;}' 1>/dev/null 2>errors 
cat errors | less 

gawk: warning: regexp constant `//' looks like a C++ comment, but is not 
b 
d 
gawk: (FILENAME=- FNR=4) warning: no explicit close of file `/dev/stderr' provided 

Aber man kann die falsche gaffen Warnungen (sie sind nicht von Belang) sehen. Sie könnten beispielsweise gefiltert werden,

filter-gawk-output.sh 
--------------------- 
grep -Ev 'looks like a|explicit close' 

Gibt es mit einer elegante Weise, dass in-line zu tun, wenn zu Umleitung Fehler-Datei? jetzt Recht, wenn Fehler Dateien untersuchen ich immer

cat errors | ./filter-gawk-output.sh | less 
+0

Hier kommt der unvermeidliche Kommentar über Ihre (bewilligt, bewundernswert konsistent) nutzlose Verwendung von Cat. Siehe http://partmaps.org/era/unix/award.html – tripleee

+1

@tripleee: Ich könnte argumentieren, dass meine Verwendung von cat die Pipeline-Eingabe deutlicher macht und keinen zusätzlichen Parameter für meine Skripte erfordert; Praktischer gesagt, wenn Sie eine Menge Dinge ausprobieren, erleichtert das Starten der Pipeline mit einer 'Katze' das Hinzufügen eines Greps oder einer Sed usw. zwischen – haelix

+0

Ich vermute, dass es keine Möglichkeiten gibt,' gawk' die Diagnose umzuleiten zu anderen Orten als stderr. Wenn dies der Fall ist, dann handelt es sich wirklich um allgemeine Syntax für Ihre Shell der Wahl ('bash',' tcsh', 'zsh' oder was auch immer). – FooF

Antwort

0

Was:

gawk --lint=invalid 'whatever' INPUTFILE 2> GAWK_ERRORS.LOG 

diese Weise STDERR wird in das Fehlerprotokoll weitergeleitet.

+0

Ok, das ist die Art und Weise, wie es jetzt funktioniert, was ich will, ist, diese unechten Gawk-Fehler wie die, die in meinem Beitrag erwähnt wurden, nicht an GAWK_ERRORS.LOG auszugeben. Denken Sie daran, dass mein GAWK_ERRORS.LOG nicht nur ** gawk ** Fehler enthält, sondern auch eine Menge von Diagnosen, die ich selbst in den Skriptcode einfüge (der andere Skripte etc. aufruft). Bei einem komplexen Skript wäre es nett, nur relevante Fehlermeldungen zu erhalten.Danke – haelix

0

Ich bin nicht bewusst, gawk mit der Möglichkeit, die Ausgabe von Warnungen zu ändern. Ich denke, das ist eher eine Frage der Shell-Syntax.

Bei

filter_warnings() { grep -v '^gawk:'; } 
awkprog='BEGIN {b = 1;} // {if (b) print; else print > "/dev/stderr"; b = !b;}' 

wo filter_warnings zum Ausfiltern der gawk Warnungen und bash als Shell unter der Annahme, können wir stderr an Rohr Befehl |& Syntax richten:

echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid "$awkprog" |& filter_warnings 

Wenn Sie möchten Ausgaben in Datei, müssen dann Klammern verwenden:

(echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid "$awkprog" > output.1) |& filter_warnings > output.2 

Hier output.1 enthält die gawk Programmausgabe zu stdout und output.2 das Programm Ausgabe auf stderr.

+0

Hallo und danke, das scheint auf dem richtigen Weg zu sein. Aber stellen Sie sich vor, dass mein Gawk-Aufruf (Ihre letzte Zeile in Ihrer Antwort) in einem Skript enthalten ist und das Skript nicht die Dateiumleitung durchführt, sondern die Außenwelt. Wenn ich also | & verwende, wird der Fehler mit der Ausgabe gemischt, und beide werden gefiltert und ausgegeben. – haelix

+0

Was ich brauche ist, die Standardausgabe unberührt zu lassen und nur den Standardfehler zu filtern, alles in einem Skript. Dann hätte dieses Skript die korrekte Standardausgabe und den gefilterten Standardfehler, der für die Umleitung in alle Dateien verfügbar ist, die der Anrufer wünscht. Macht das Sinn? – haelix