awk:戻りステータスを強制しますか?


17

これは私の以前の質問のフォローアップです。

この便利なスニペットを使用して、/ 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」で終了させ、一致するすべての行を印刷できますか?

回答:


23

ステータスを変数に保持し、ENDブロックで使用します。

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd

とても良い。ただし、これをbashスクリプトに組み込む際に問題が発生します。; echo $?このawkステートメントの後に何かを追加することで、このawkステートメントの戻りステータスをキャプチャしようとしています。ただし、echo $?END {exit err}'スクリプトを終了するため実行されません。終了せずに戻りステータスを設定する方法はありますか?
ステファンLasiewski

6
@StefanLasiewski exit errはawkを終了しますが、スクリプトは終了しません。もしかして、あなたはset -eそのスクリプトの中にありますか?その場合、コマンドがゼロ以外のステータスを返した場合に終了するようシェルに指示しました。ステータスをテストする場合は、を使用しますif awk …; then echo ok; else echo fail; fi
ジル 'SO-悪であるのをやめる'

@Giles:はい、このスクリプトにはset -e設定があります。それは私が見ている奇妙な行動を説明しています。それを指摘してくれてありがとう。
ステファンLasiewski

1
bashの&&演算子を使用して出力を使用する場合、「シェルでは0はtrueですがfalseは1である」ことに注意してください。
スキッピールグラングロウ

7

grepに似たものを探していました。一致するものが見つからない場合は1を終了します。これはawkと同等です:

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


0

これはOPの正確な要件には対応しませんが、戻りコードのみを気にし、一致する行を印刷する必要がないgrep -q場合は、@ geekasaurの回答を変更して、最初の一致後に終了することができます。ファイル内のエラーが早い場合、ファイルは時間を節約します。うまくいけば/etc/passwdあなたに資格がありません!

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd

1
awk -F: 'NF != 7 {exit 1}'同じことをします。
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.