如果第四列与正则表达式不匹配,我想获得退出代码 1,但似乎 awk 将返回 0,即使正则表达式不匹配。
如果正则表达式不匹配,知道如何让 awk 返回 1 吗?
root@server:~# netstat -nap|grep "LISTEN\b"
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1144/rsync
tcp 0 0 1.2.3.4.5:53 0.0.0.0:* LISTEN 25213/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 25213/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 28888/sshd
tcp 0 0 0.0.0.0:9686 0.0.0.0:* LISTEN 1150/stunnel
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 25213/named
root@server:~# netstat -nap|grep "LISTEN\b"|awk '$4 ~ /:80$/ {print $NF}'
root@server:~# echo $?
0
答案1
对我来说,这是awk不可饶恕的罪孽;如果需要错误状态,我会通过管道发送到 grep dot,而不是上面的 awk 体操
$ date | awk '/Fri/'
Fri May 29 21:26:18 EDT 2020
$ date | awk '/Fri/' | grep .
Fri May 29 21:27:11 EDT 2020
$ echo $?
0
$ date | awk '/Mon/' | grep .
$ echo $?
1
答案2
您可以设置一个变量来保存返回码,然后在退出之前取反该变量:
netstat -nap |
grep "LISTEN\b" |
awk '$4 ~ /:80$/ {rc = 1; print $NF}; END { exit !rc }'
如果不需要\b
,可以删除grep
部分:
netstat -nap | awk '/LISTEN/ && $4 ~ /:80$/ {rc = 1; print $NF}; END { exit !rc }'