Eu tenho um arquivo de log de acesso com diferentes números de porta na coluna 2. Quero listar todo o tráfego que passou por portas pares. Como eu posso fazer isso?
Responder1
Não sou especialista em awk
, mas aqui está um exemplo simples de uso do operador 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 onde $3
estáatéé impresso.
Responder2
se o seu arquivo de log for 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 a linha completa da mensagem de log que possui um número de porta par 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"
OU
se você quiser imprimir apenas a porta nã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
Observação:Presumo que você não tenha uma linha em branco em seu arquivo de log.
Responder3
Dependendo do formato de arquivo que você usa (delimitador de espaço, vírgula, barra vertical, etc.):
cat <filename> | awk -F"<delimiter>" '{if ($<column number> %2 == 0){print $0}}'
Arquivo de amostra que criei conforme abaixo:
/ : server1> cat test1
a 2
b 1
c 5
d 6
e 9
f 8
Vou realizar a consulta abaixo para obter o resultado desejado:
/ : server1> cat test1 | awk -F" " '{if ($2 %2 == 0){print $0}}'
a 2
d 6
f 8