この Awk コマンドが何をするのか説明してください

この Awk コマンドが何をするのか説明してください

VoIPBL 更新スクリプトの一部を持っています。

cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\"  != \"#\" ]; then /usr/sbin/ipset  -A voipbl_temp \""$1"\" ;fi;"}'

次のような行が作成されます。

if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32"  != "#" ]; then  /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi; | sh

2 番目の部分はファイル (IP) から ipset に行を追加するものであることは理解していますが、テスト条件は何を行っているのでしょうか。-z と -a が同じ括弧内にある場合、それは何を意味するのでしょうか。また、「#」と等しくない部分は何を意味するのでしょうか。

答え1

おそらく/tmp/voipbl.txtファイルから IP を読み取り、それに基づいてシェル if 構造を作成します。awk$1スクリプトのパラメータは各行の最初の列の項目を参照するため、1.2.3.4/32各反復で の代わりに使用される文字列はその値になります。

if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32"  != "#" ]; then

! -z "1.2.3.4/32"- "1.2.3.4/32"nullではないかどうかをチェックします。 -z文字列がゼロですが、はそれを否定します。これは、 nullでないかどうかをチェックするだけ!のものに置き換えることができます。-n

"1.2.3.4/32" != "#"- が"1.2.3.4/32"等しくないことをチェックしていますが、#これはファイル内に表示される可能性があるものだと思います。

演算子-aそしてつまり、文字列が null ではなく、かつ と等しくないことがチェックされます#

これらの条件が満たされると、以下が実行されます。

/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"

これをよりよく理解するには、次の内容のファイルに対して awk コマンドを実行してみてください。

1.2.3.4/32

# 3.4.5.6/32

そのファイルに対して awk コマンドを実行すると、次の結果が得られます。

$ awk '{ print "if [ ! -z \""$1"\" -a \""$1"\"  != \"#\" ]; then /usr/sbin/ipset  -A voipbl_temp \""$1"\" ;fi;"}' file
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32"  != "#" ]; then /usr/sbin/ipset  -A voipbl_temp "1.2.3.4/32" ;fi;
if [ ! -z "" -a ""  != "#" ]; then /usr/sbin/ipset  -A voipbl_temp "" ;fi;
if [ ! -z "#" -a "#"  != "#" ]; then /usr/sbin/ipset  -A voipbl_temp "#" ;fi;

テストでは、 が/usr/sbin/ipset最初の行でのみ実行され、1.2.3.4/32他の 2 行では が実行されないことが保証されます。

関連情報