Eu quero tail -f
meus logs. No entanto, quero filtrar tudo o que tem as palavras:
"ELB", "Pingdom", "Saúde"
Eu quero tail -f
meus logs. No entanto, quero filtrar tudo o que tem as palavras:
"ELB", "Pingdom", "Saúde"
Respostas:
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 egrep
vez de grep -E
por 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 -E
switch. No entanto, de acordo com a página de manual do GNU grep:
[…] Dois programas variantes
egrep
efgrep
estão disponíveis.egrep
é o mesmo quegrep -E
.fgrep
é o mesmo quegrep -F
. A chamada direta comoegrep
oufgrep
é 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 -E
sintaxe, pois o outro método foi oficialmente descontinuado.
grep -E
vez de egrep
justificar uma resposta duplicada?
sed
, awk
, perl
, multitail
ou ninja_foo
.
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 multitail
o 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
.
Por que você deseja registrar essas informações?
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?