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?
quelle
; echo $?
nach dieser awk-Anweisung etwas hinzufüge . Wirdecho $?
jedoch nie ausgeführt, daEND {exit err}'
das Skript beendet wird. Gibt es eine Möglichkeit, den Rückgabestatus festzulegen, ohne das Programm zu verlassen?exit err
beendet awk, das Skript wird nicht beendet. Haben Sieset -e
in 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 Sieif awk …; then echo ok; else echo fail; fi
.set -e
gesetzt. Das erklärt das seltsame Verhalten, das ich sehe. Vielen Dank für den Hinweis.&&
Operator zu verwenden, sollten Sie berücksichtigen, dass "0 wahr ist, aber falsch ist 1 in der Shell" .Ich habe nach etwas ähnlichem wie grep gesucht, bei dem 1 beendet wird, wenn keine Übereinstimmung gefunden wird. Hier ist das Äquivalent zu awk:
Beispiel
quelle
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 -q
kö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/passwd
nicht für Sie qualifiziert!quelle
awk -F: 'NF != 7 {exit 1}'
werde das gleiche tun.