awk:强制返回状态吗?


18

这是我先前问题的跟进。

我正在使用此方便的代码段验证/ 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语句合并到shell脚本中。我想打印所有错误的行,并将返回代码设置为1(错误)。

我可以尝试强制使用特定的退出状态,但是awk仅打印一行:

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

我可以强制awk以返回状态“ 1”退出并打印所有匹配的行吗?

Answers:


23

将状态保留在变量中,并在END块中使用它。

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

很好。但是我遇到了将其合并到bash脚本中的问题。我试图通过; echo $?在此awk语句之后添加类似内容来捕获此awk语句的返回状态。但是,echo $?永远不会运行,因为END {exit err}'终止脚本。有没有一种方法可以设置返回状态而不退出?
Stefan Lasiewski 2011年

6
@StefanLasiewski exit err终止awk,它不终止脚本。您有没有set -e那个脚本?如果是这样,您已经告诉外壳程序在命令返回非零状态时退出;如果要测试状态,请使用if awk …; then echo ok; else echo fail; fi
吉尔(Gilles)'所以

@Giles:是的,此脚本确实已set -e设置。这就解释了我所看到的奇怪行为。感谢您指出了这一点。
Stefan Lasiewski 2011年

1
如果您打算将输出与bash的&&运算符一起使用,则应牢记“外壳中的0为true,但false为1”
世纪

8

我一直在寻找与Grep类似的东西,如果找不到匹配项,它将退出1。这与Awk等效:

#!/usr/bin/awk -f
BEGIN {
   b1 = 1
}
index($0, "sunday") > 0 {
   b1 = 0
   print
}
END {
   exit b1
}

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}'会做同样的。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.