我有 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
而不会在其他两行上运行。