解釋一下這個 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

我知道第二部分是將文件(IP)中的一行添加到 ipset,但是測試條件在做什麼?當 -z 和 -a 在同一組括號中時,這意味著什麼?不等於「#」部分是什麼意思?

答案1

它從/tmp/voipbl.txt檔案中讀取大概的 IP,然後根據它們建立一個 shell。 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檢查字串是否零,但!否定了這一點。這可以而且可能應該被替換為-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而不會在其他兩行上運行。

相關內容