これは私の 以前の質問 のフォローアップです。
この便利なスニペットを使用して、/ etc/passwdのフィールド数を検証しています。次の例では、ユーザー 'fieldcount1'および 'fieldcount2'のフィールド数が間違っています。
$ 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
お気づきのように、awkは戻りステータス0で終了します。その観点から、ここでは問題はありません。
このawkステートメントをシェルスクリプトに組み込みたいのですが。エラーのあるすべての行を印刷し、戻りコードを1(エラー)に設定します。
特定の終了ステータスを強制的に試すことができますが、awkは1行しか出力しません。
$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1
Awkを強制的に「1」の戻りステータスで終了し、一致するすべての行を出力できますか?
ステータスを変数に保持し、END
ブロックで使用します。
awk -F: 'NF != 7 {print; err = 1}
END {exit err}' /etc/passwd
私はGrepに似たものを探していましたが、一致が見つからない場合は1で終了します。これはAwkと同等です:
#!/usr/bin/awk -f
BEGIN {
b1 = 1
}
index($0, "sunday") > 0 {
b1 = 0
print
}
END {
exit b1
}
これはOPの正確な要件には対応していませんが、onlyが戻りコードを気にし、notを印刷する必要がある場合一致する行(grep -q
と同様)の場合、@ geekasaurの回答を変更して、最初の一致の後に終了することができます。これにより、巨大な入力ファイルの場合、エラーがファイルの早い段階で発生すると時間を節約できます。 /etc/passwd
はご利用いただけません。
awk -F: 'NF != 7 {err = 1; exit;}
END {exit err}' /etc/passwd