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)の1行をipsetに追加することを知っていますが、テスト条件は何をしていますか? -zと-aが同じ括弧内にある場合はどういう意味ですか? 「#」以外の部分はどういう意味ですか?
答え1
/tmp/voipbl.txt
ファイルからおおよそのIPを読み取り、それに基づいてシェルを作成します。 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"
。 -z
文字列であることを確認はい0ですが、!
これを否定します。これは-n
nullでないことを確認することで置き換えることができ、おそらく置き換える必要があります。
"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行では実行されません。