Eu tenho uma parte do script de atualização do VoIPBL.
cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}'
Ele cria linhas como esta:
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
Entendo que a segunda parte é adicionar uma linha do arquivo (IP) a um ipset, mas o que a condição de teste está fazendo? O que significa quando você tem -z e -a no mesmo conjunto de colchetes? E o que significa a parte diferente de "#"?
Responder1
Ele está lendo presumivelmente IPs do /tmp/voipbl.txt
arquivo e, em seguida, criando um shell if construído com base neles. O $1
parâmetro do script awk refere-se ao item na primeira coluna de cada linha, portanto a string no lugar de 1.2.3.4/32
será esse valor em cada iteração.
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then
! -z "1.2.3.4/32"
- Está verificando se "1.2.3.4/32"
não é nulo. -z
verifica se a stringézero, mas o !
nega isso. Isso poderia e provavelmente deveria ser substituído por -n
apenas verificar se não é nulo
"1.2.3.4/32" != "#"
- Está verificando que "1.2.3.4/32"
não é igual ao #
que eu acho que é algo que pode aparecer no seu arquivo.
O -a
operador significae. Então é verificar se a string não é nula E se não é igual #
.
Se essas condições forem atendidas, o seguinte será executado:
/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"
Para entender isso melhor, tente executar o comando awk em um arquivo com o seguinte conteúdo:
1.2.3.4/32
# 3.4.5.6/32
Se você executar agora o comando awk nesse arquivo, obterá:
$ 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;
Os testes garantem que /usr/sbin/ipset
só será executado na primeira linha, com 1.2.3.4/32
e não nas outras duas.