No tail -f, como filtrar coisas que possuem determinadas palavras-chave?

Respostas:

58

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

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

EDIT: Como dmourati e Caleb apontaram, você também pode usar em egrepvez de grep -Epor conveniência. Em alguns sistemas, isso será um link para o mesmo binário; em outros, uma cópia fornecida pelo pacote grep. De qualquer maneira, ele vive como uma alternativa ao -Eswitch. No entanto, de acordo com a página de manual do GNU grep:

[…] Dois programas variantes egrepe fgrepestão disponíveis. egrepé o mesmo que grep -E. fgrepé o mesmo que grep -F. A chamada direta como egrepou fgrepé preterida, mas é fornecida para permitir que aplicativos históricos que dependem deles sejam executados sem modificação.

Como são comandos sinônimos, tudo se resume a preferência, a menos que você não tenha o egrep. No entanto, para compatibilidade com encaminhamento, é recomendável usar a grep -Esintaxe, pois o outro método foi oficialmente descontinuado.

DTest
fonte
Usar em grep -Evez de egrepjustificar uma resposta duplicada?
Caleb
@ Caleb Não vejo por que não. Há mais de uma maneira de esfolar um gato, e este site permite a capacidade de lista de todos
dtest
1
Sim, mas são apenas links simbólicos entre si, não dois programas diferentes com alguma sobreposição funcional. Portanto, isso não seria mais um 'adendo' (leia-se: comentário), não uma resposta completa? Eu tive downvotes para delitos menores ...
Marcin
@DTest: Por direito, dmourati realmente me venceu por alguns segundos e, embora ele não tenha explicado o raciocínio, ele merece algum crédito aqui. Você estava claramente atrasado para a festa, já que nós dois tivemos pelo menos duas votações antes de você entrar. Alterar a sintaxe de um binário com link simbólico para um argumento geralmente é algo para o qual você usaria um comentário, não uma resposta separada. Se você quiser a pele do gato diferente usar sed, awk, perl, multitailou ninja_foo.
Caleb
1
@ Test: Tomei a liberdade de fazer uma edição factual significativa da sua resposta para adicionar algumas fontes originais. Parece que -E é recomendado para uso futuro, então marquei isso, mas removi sua observação sobre distros que não possuem egrep. As distros mencionadas têm egrep, é apenas um binário separado em vez de um link simbólico.
Caleb
21

Tente canalizá-lo para egrep com listas separadas de palavras 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, se ocorre como parte de um subgrupo ou não. '(ELB|Pingdom|Health)'funcionaria exatamente da mesma maneira. Para alguns, a sintaxe pode ser mais óbvia; Acho mais fácil digitar sem, pois posso alternar de uma única correspondência para uma lista de possíveis correspondências sem voltar a adicionar os parênteses.

Para crédito extra, vale ressaltar que multitailo 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 realçar a saída em vez de apenas filtrá-la.

Edição: Veja a resposta do DTests e os comentários para obter uma explicação completa de como o egrep é apenas uma maneira alternativa obsoleta de disparar grep -E.

Caleb
fonte
2
não deve fim expressão com ( '), e não com ( ")?
bbaja42
Sim, obrigado, isso foi um erro de digitação. Para referência futura, já que sites de troca de pilhas funcionam como wikis, esse é o tipo de coisa que você pode corrigir.
Caleb
Eu pensei que a edição tinha que ter mais de 6 caracteres?
Sirex
Se você não tem alta rep, sim, há um mínimo de 6 caracteres, mas neste caso o caractere 1 é super importante. Você pode forçar a alteração adicionando um comentário HTML ao corpo. Os personagens serão contados até o limite e você poderá observar por que está fazendo a alteração.
Caleb
Caleb @ muito obrigado pela sugestão multitail é incrível ! Não posso acreditar que passei tanto tempo na minha vida sem ele.
sidewinderguy
5
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
dmourati
fonte
3

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

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

Se você deseja ter um comportamento baseado em script, dependendo do conteúdo dos arquivos de log, convém fazer a filtragem usando o Expect. ( http://en.wikipedia.org/wiki/Expect ) Expect é uma extensão Tcl, mas também existe uma versão em Python do Expect.

O Expect fornece uma poderosa opção flexível como a 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 agrupar tudo em um loop, e pode escrever facilmente filtros muito poderosos que também gravam partes de sua entrada em arquivos diferentes, ou largam-na completamente, ou execute ações e execute outros scripts, dependendo do que está na sua entrada.

Então, tudo se resume a por que você está tentando filtrar seus arquivos de log, executar ações na entrada de log ou apenas por razões de arquivamento?

Jerry Asher
fonte
Mais um para a referência ao Expect, que usei há muito tempo e havia esquecido completamente.
MPi