Filtre linhas duplicadas de tail -f [duplicate]

1

Frequentemente, preciso enviar os logs de acesso do apache para sites para solucionar problemas. Uma coisa que torna irritante o fato de alguém carregar uma página uma vez pode fazer com que mais de 12 linhas sejam gravadas no log e linhas cada um envolve várias linhas no meu terminal.

tail -f parece funcionar muito bem com piping para grep e awk, e eu criei uma solução bastante simples para filtrar duplicatas quando um endereço IP faz muitas requisições em um determinado segundo (assim como para ajustá-lo ao particular informações que eu geralmente preciso) -

tail -f log.file | awk '{print $ 1 "" $ 4 "" $ 9} "| uniq

O problema é que isso não funciona. Eu simplesmente não obtenho nenhuma saída, mesmo quando sei que deve haver toneladas de linhas impressas.

Eu tentei algumas soluções de problemas, mas não consegui fazer as coisas realmente funcionarem -

tail -f log.file | awk ' { print $1 " " $4 " " $9}' 

Isso funciona exatamente como deveria, e imprime as linhas como elas acontecem (mas com muitas duplicatas) assim:

12.34.56.78 [10/May/2016:18:42:01 200
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
tail log.file | awk ' { print $1 " " $4  " " $9}' | uniq

Isso também funciona exatamente como deveria, e filtra todas as linhas duplicadas. Mas para minha solução de problemas, realmente preciso das atualizações em tempo real de tail -f

Como posso fazer com que tail -f filtre linhas duplicadas?

    
por Yex 11.05.2016 / 01:45

1 resposta

0

Como uma solução awk pura, tente:

tail -f log.file | awk ' $0!=last{ print $1 " " $4 " " $9} {last=$0}'

Este imprime uma nova linha de saída somente se a linha de entrada for diferente da linha de entrada anterior.

Como uma pequena variação, esta imprime uma nova linha de saída somente se essa linha de saída for diferente da linha de saída anterior:

tail -f log.file | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}'

Exemplo

Vamos tentar este arquivo de teste:

$ cat logfile
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 11
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 19 12
1 2 3 4 5 6 7 8 19 13
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 29

o awk filtra as linhas de saída duplicadas:

$ cat logfile | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}' 
1 4 9
1 4 19
1 4 29
    
por 11.05.2016 / 02:05