解释一下这个 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而不会在其他两行上运行。

相关内容