Explique o que este comando Awk faz

Explique o que este comando Awk faz

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.txtarquivo e, em seguida, criando um shell if construído com base neles. O $1parâmetro do script awk refere-se ao item na primeira coluna de cada linha, portanto a string no lugar de 1.2.3.4/32será 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. -zverifica se a stringézero, mas o !nega isso. Isso poderia e provavelmente deveria ser substituído por -napenas 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 -aoperador 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/ipsetsó será executado na primeira linha, com 1.2.3.4/32e não nas outras duas.

informação relacionada