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 $3
está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