这是我的后续先前的问题。
我正在使用这个方便的片段验证 /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