Explique qué hace este comando Awk

Explique qué hace este comando Awk

Tengo una parte del script de actualización de VoIPBL.

cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\"  != \"#\" ]; then /usr/sbin/ipset  -A voipbl_temp \""$1"\" ;fi;"}'

Crea líneas 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

Entiendo que la segunda parte consiste en agregar una línea del archivo (IP) a un ipset, pero ¿qué hace la condición de prueba? ¿Qué significa cuando tienes -z y -a en el mismo conjunto de paréntesis? ¿Y qué significa la parte no igual a "#"?

Respuesta1

Presumiblemente lee las IP del /tmp/voipbl.txtarchivo y luego crea un shell si se construye en base a ellas. El $1parámetro del script awk se refiere al elemento en la primera columna de cada línea, por lo que la cadena en lugar de 1.2.3.4/32será ese valor en cada iteración.

if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32"  != "#" ]; then

! -z "1.2.3.4/32"- Está comprobando que "1.2.3.4/32"no sea nulo. -zcomprueba si la cadenaescero pero !lo niega. Esto podría y probablemente debería reemplazarse con -nlo que solo verifica que no sea nulo.

"1.2.3.4/32" != "#"- Está comprobando que "1.2.3.4/32"no es igual a #lo cual supongo que es algo que podría aparecer en tu expediente.

El -aoperador significay. Por lo tanto, se verifica que la cadena no sea nula Y que no sea igual #.

Si se cumplen estas condiciones, se ejecutará lo siguiente:

/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"

Para comprender esto mejor, intente ejecutar el comando awk en un archivo con el siguiente contenido:

1.2.3.4/32

# 3.4.5.6/32

Si ahora ejecuta su comando awk en ese archivo, obtendrá:

$ 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;

Las pruebas garantizan que /usr/sbin/ipsetsolo se ejecutará en la primera línea, y 1.2.3.4/32no en las otras dos.

información relacionada