¿Cómo usar awk para imprimir si el valor de una columna tiene un número par?

¿Cómo usar awk para imprimir si el valor de una columna tiene un número par?

Tengo un archivo de registro de acceso con diferentes números de puerto en la columna 2. Quiero enumerar todo el tráfico que pasó por puertos pares. ¿Cómo puedo hacerlo?

Respuesta1

No soy experto en awk, pero aquí hay un ejemplo simple del uso del operador de módulo:

echo "foo bar 2
bar foo 3
foobar barfoo 4" | awk '($3 %2 == 0)'
foo bar 2
foobar barfoo 4

Sólo las líneas donde $3estáinclusoestá impreso.

Respuesta2

si su archivo de registro es como el siguiente:

cat logfile

192.168.1.102 81 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.101 8888 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.103 80 [15/Aug/2016:10:53:33 +0530] "some message"
192.168.1.102 2323 [15/Aug/2016:10:54:32 +0530] "some message"

luego puede imprimir la línea completa del mensaje de registro que tiene un número de puerto par usando el siguiente comando:

while read line; do if [ $((`echo "$line"|awk '{ print $2 }'` % 2)) -eq 0 ]; then echo "$line"; fi ; done < "logfile"

que producirá resultados como:

while read line; do if [ $((`echo "$line"|awk '{ print $2 }'` % 2)) -eq 0 ]; then echo "$line"; fi ; done < "logfile"
192.168.1.101 8888 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.103 80 [15/Aug/2016:10:53:33 +0530] "some message"

O

Si desea imprimir solo el puerto no, puede hacer lo siguiente:

for i in `cat logfile | awk '{ print $2 }'`; do if [ $(($i % 2)) -eq 0 ]; then echo "Port number: $i"; fi ; done

Port number: 8888
Port number: 80

Nota:Supongo que no tiene una línea en blanco en su archivo de registro.

Respuesta3

Dependiendo del formato de archivo que utilice (espacio delimitador, coma, barra vertical, etc.):

cat <filename> | awk -F"<delimiter>" '{if ($<column number> %2 == 0){print $0}}'

Archivo de muestra que he creado de la siguiente manera:

/ : server1> cat test1
a 2
b 1
c 5
d 6
e 9
f 8

Realizaré la consulta como se muestra a continuación para obtener el resultado deseado:

/ : server1> cat test1 | awk -F" " '{if ($2 %2 == 0){print $0}}'
a 2
d 6
f 8

información relacionada