awk:强制返回状态?

awk:强制返回状态?

这是我的后续先前的问题

我正在使用这个方便的片段验证 /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”退出,并打印所有匹配的行吗?

答案1

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

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

答案2

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

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

答案3

这并没有回答OP的确切要求,但是如果你仅有的关心返回码,并且不是需要打印匹配的行,类似于grep -q,那么您可以修改 @geekasaur 答案 以在第一个匹配后退出,对于巨大的输入文件,如果错误出现在文件的早期,这将节省时间。希望/etc/passwd不符合您的资格!

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

相关内容