usando grep para mostrar entradas que correspondam a um padrão e estejam presentes pelo menos X vezes

4

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.

    
por SpaceDog 17.02.2013 / 20:56

2 respostas

5
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.

    
por 17.02.2013 / 21:35
1

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
}
    
por 17.02.2013 / 21:08