Em tail -f, como eu filtra coisas que têm certas palavras-chave?

34

Eu quero tail -f meus logs. No entanto, quero filtrar tudo o que tem as palavras:

"ELB", "Pingdom", "Saúde"

    
por Alex 18.05.2011 / 02:11

4 respostas

55

Eu não sei usar o awk em vez do grep, mas isso funciona para mim:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

EDITAR: Como dmourati e Caleb apontou, você também pode usar egrep em vez de grep -E para sua conveniência. Em alguns sistemas isso será um link para o mesmo binário, em outros uma cópia dele é fornecida pelo pacote grep. De qualquer forma, ela é uma alternativa à opção -E . No entanto, de acordo com a página man do GNU grep:

[…]two variant programs egrep and fgrep are available. egrep is the same as grep -E. fgrep is the same as grep -F. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.

Como eles são comandos sinônimos, tudo se resume à preferência, a menos que você não tenha o egrep. No entanto, para compatibilidade futura, recomenda-se usar a sintaxe grep -E , pois o outro método é oficialmente obsoleto.

    
por 18.05.2011 / 02:19
20

Tente colocá-lo no egrep com listas de palavras separadas por pipe que você deseja filtrar:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Observe que o uso de parênteses na lista de correspondências é opcional. Como o | é tratado como um operador OR lógico pelo grep, quer ocorra como parte de um subgrupo ou não. '(ELB|Pingdom|Health)' funcionaria exatamente da mesma forma. Para alguns, a sintaxe pode ser mais óbvia; Eu acho mais fácil digitar sem que eu possa mudar de uma única correspondência para uma lista de possíveis correspondências sem voltar para adicionar os parênteses.

Para crédito extra, vale a pena mencionar que multitail faz ninja foo quando se trata de filtrar a saída. Por exemplo, você pode filtrar suas palavras assim:

multitail -e ELB -e Pingdom -e Health -f log_file

Você também pode usá-lo para colorir ou destacar a saída em vez de apenas filtrá-lo.

EDit: Veja DTests responder e os comentários para a explicação completa de como o egrep é apenas uma maneira alternativa descontinuada para disparar grep -E .

    
por 18.05.2011 / 02:19
5
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
    
por 18.05.2011 / 02:18
3

Por que você deseja registrar essas informações?

  • É estritamente para arquivamento?
  • Deseja executar condicionalmente scripts diferentes dependendo de diferentes palavras-chave ou padrões nos arquivos de log?

Se você deseja ter um comportamento de script, dependendo do conteúdo dos arquivos de log, talvez deseje fazer sua filtragem usando o Expect. ( link ) Esperar é uma extensão Tcl, mas também existe uma versão Python do Expect.

O recurso Expect oferece a você esse poderoso e flexível switch, como uma instrução que permite especificar diferentes comportamentos condicionalmente, dependendo dos estados ou padrões presentes no seu fluxo de entrada. Por exemplo:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Assim, você especifica padrões na instrução expect, e especifica comportamentos diferentes, e pode envolver a coisa toda em um loop, e pode facilmente escrever filtros muito poderosos que também gravam partes de sua entrada em arquivos diferentes ou Completamente, ou tomar ações e executar outros scripts, dependendo do que está em sua entrada.

Por isso, você está tentando filtrar seus arquivos de log, realizar ações de entrada de log ou apenas por motivos de arquivamento?

    
por 18.05.2011 / 05:22