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
Hier kommt der unvermeidliche Kommentar über Ihre (bewilligt, bewundernswert konsistent) nutzlose Verwendung von Cat. Siehe http://partmaps.org/era/unix/award.html – tripleee
@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
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