awk:强制返回状态?

Ste*_*ski 20 awk shell-script text-processing

这是我之前的问题的后续。

我正在使用这个方便的代码段验证 /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
Run Code Online (Sandbox Code Playgroud)

您会注意到,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
Run Code Online (Sandbox Code Playgroud)

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

gee*_*aur 26

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

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

  • @StefanLasiewski `exit err` 终止 awk,它不会终止脚本。你在那个脚本中有 `set -e` 吗?如果是这样,您已经告诉 shell 在命令返回非零状态时退出;如果要测试状态,请使用 `if awk ...; 然后回声确定;否则回声失败;菲`。 (6认同)

Ste*_*nny 9

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

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