Como usar o awk para imprimir se um valor de coluna tiver um número par

0

Eu tenho um arquivo de log de acesso com números de porta diferentes na coluna 2. Quero listar todo o tráfego que passou por portas pares. Como posso fazer isso?

    
por Ram Korla 31.10.2016 / 08:38

3 respostas

3

Nenhum especialista em awk , mas aqui está um exemplo simples de usar o operador de módulo:

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

Apenas as linhas em que $3 é mesmo são impressas.

    
por 31.10.2016 / 08:48
1

se o seu arquivo de log é como abaixo:

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"

então você pode imprimir uma linha completa de mensagens de log com o mesmo número de porta usando o comando abaixo:

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

que produzirá 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"

OR

se você quiser imprimir apenas a porta não, então você pode fazer como:

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: estou supondo que você não tem linha em branco no seu arquivo de log.

    
por 31.10.2016 / 09:28
0

Dependendo do formato de arquivo usado (espaço delimitador, vírgula, canal, etc):

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

Exemplo de arquivo que criei abaixo:

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

Vou realizar a consulta abaixo para obter a saída desejada:

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