この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)の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ですが、!これを否定します。これは-nnullでないことを確認することで置き換えることができ、おそらく置き換える必要があります。

"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行では実行されません。

おすすめ記事