sed < mail.log -n 's/.*auth failed.*rip=\([^,]*\).*//p' |
sort |
uniq -c |
awk '$1 >= 3' |
sort -rn
Daria a você os endereços IP correspondentes com o número de ocorrências classificados por número de ocorrência.
Eu tenho um arquivo com entradas como essa, entre outras linhas
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Toda vez que uma linha como essa é encontrada, eu quero extrair os IPs associados na parte rip, mas eu quero extrair os IPs que aparecem pelo menos 3 vezes.
Estou tentando usar o grep para fazer isso.
Este é o grep que eu tenho
more /var/log/maillog-20130217 | grep "auth failed" | grep -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4
][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
este grep mostra todos os IPs que estão nas linhas correspondentes
Como limitar esse grep para mostrar apenas IPs se eu tiver pelo menos três linhas correspondentes com esse IP e apenas IPs exclusivos?
Eu quero dizer isso. Suponha que meu log tenha isso
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=20.20.20.20, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Eu gostaria de usar grep e obter 200.250.9.210 porque eu tenho 3 linhas lá com este IP, mas não 20.20.20.20 que aparece apenas uma vez.
O que eu tenho quando corro meu grep eu tenho é isso
200.250.9.210
200.250.9.210
20.20.20.20
200.250.9.210
ou, em outras palavras, está listando todos os IPs que estão em linhas correspondentes.
obrigado.
Pode ser tão simples assim:
grep "whatever" "$file" | sort | {
LAST=""
counter=0
while read -r LINE; do
if [ x"$LINE" = x"$LAST" ]; then
if [ 3 -eq "$((counter+=1))" ]; then
echo "$LINE present more that 4 times"
fi
else
counter=0
LAST="$LINE"
fi
done
}
Tags grep text-processing