awk: Rückgabestatus erzwingen?

16

Dies ist eine Fortsetzung meiner früheren Frage .

Ich überprüfe die Anzahl der Felder in / etc / passwd mit diesem praktischen Snippit. Im folgenden Beispiel haben die Benutzer 'fieldcount1' und 'fieldcount2' die falsche Anzahl von Feldern:

$ awk -F: ' NF!=7 {print}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
fieldcount2:blah::blah:1002:100:fieldcount2:/home/fieldcount2:/bin/bash:
$ echo $?
0

Wie Sie feststellen werden, wird awk mit einem Rückgabestatus von 0 beendet. Aus seiner Sicht gibt es hier keine Probleme.

Ich möchte diese awk-Anweisung in ein Shell-Skript integrieren. Ich möchte alle fehlerhaften Zeilen drucken und den Rückkehrcode auf 1 setzen (Fehler).

Ich kann versuchen, einen bestimmten Exit-Status zu erzwingen, aber awk gibt dann nur eine einzelne Zeile aus:

$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1

Kann ich awk zwingen, mit dem Rückgabestatus '1' zu beenden und alle übereinstimmenden Zeilen auszudrucken?

Stefan Lasiewski
quelle

Antworten:

23

Behalten Sie den Status in einer Variablen und verwenden Sie ihn in einem ENDBlock.

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd
Geekosaurier
quelle
Sehr gut. Ich habe jedoch Probleme, dies in ein Bash-Skript zu integrieren. Ich versuche, den Rückgabestatus dieser awk-Anweisung zu erfassen, indem ich ; echo $?nach dieser awk-Anweisung etwas hinzufüge . Wird echo $?jedoch nie ausgeführt, da END {exit err}'das Skript beendet wird. Gibt es eine Möglichkeit, den Rückgabestatus festzulegen, ohne das Programm zu verlassen?
Stefan Lasiewski
6
@StefanLasiewski exit errbeendet awk, das Skript wird nicht beendet. Haben Sie set -ein diesem Skript zufällig? In diesem Fall haben Sie die Shell angewiesen, das Programm zu beenden, wenn ein Befehl einen Status ungleich Null zurückgibt. Wenn Sie den Status testen möchten, verwenden Sie if awk …; then echo ok; else echo fail; fi.
Gilles 'SO- hör auf böse zu sein'
@Giles: Ja, dieses Skript hat set -egesetzt. Das erklärt das seltsame Verhalten, das ich sehe. Vielen Dank für den Hinweis.
Stefan Lasiewski
1
Wenn Sie vorhaben, die Ausgabe mit dem bash- &&Operator zu verwenden, sollten Sie berücksichtigen, dass "0 wahr ist, aber falsch ist 1 in der Shell" .
Skippy le Grand Gourou
7

Ich habe nach etwas ähnlichem wie grep gesucht, bei dem 1 beendet wird, wenn keine Übereinstimmung gefunden wird. Hier ist das Äquivalent zu awk:

awk '
BEGIN   {z=1}
/bravo/ {z=0; print}
END     {exit z}
' alpha.txt

Beispiel

Steven Penny
quelle
0

Dies entspricht nicht den genauen Anforderungen des OP, sondern nur Ihren Wünschen für den Rückkehrcode interessieren und die übereinstimmenden Zeilen nicht drucken müssen, grep -qkönnen Sie die @geekasaur-Antwort ändern, um sie nach dem ersten Treffer zu beenden Dateien würden Zeit sparen, wenn der Fehler zu Beginn der Datei auftritt. Hoffentlich /etc/passwdnicht für Sie qualifiziert!

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd
Mark Stewart
quelle
1
awk -F: 'NF != 7 {exit 1}'werde das gleiche tun.
Stéphane Chazelas