正規表現が一致しない場合 awk 終了コード

正規表現が一致しない場合 awk 終了コード

4番目の列が正規表現と一致しない場合は終了コード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の許せない罪です。エラー状態が必要な場合は、上記のawk体操の代わりにgrep dotにパイプします。

$ 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 }'

関連情報