it-swarm-pt.tech

grep e tail -f?

É possível fazer um tail -f (ou similar) em um arquivo e grep ao mesmo tempo? Eu não me importaria com outros comandos apenas procurando esse tipo de comportamento.

30
xenoterracide

Usando GNU tail e GNU grep, eu sou capaz de grep um tail -f usando a sintaxe direta:

tail -f /var/log/file.log | grep search_term
48
Steven D

Adicionar --line-buffered a grep, e isso pode reduzir o atraso para você. Muito útil em alguns casos.

tail -f foo | grep --line-buffered bar
7
Digit

Funcionará bem; de maneira mais geral, grep esperará quando um programa não estiver sendo exibido e continuará lendo quando a saída chegar, por isso, se você fizer:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

Nada acontecerá por 5 segundos, então o grep emitirá o "teste" correspondente e, cinco segundos depois, sairá quando o processo canalizado

7
Michael Mrozek

Você pode apenas canalizar a saída de grep para tail -f . Existem também programas que combinam tail -f funcionalidade com filtragem e coloração, em particular multitail ( exemplos ).

3

Eu vejo todas essas pessoas dizendo para usar tail -f, mas não gosto das limitações disso! Meu método favorito de pesquisar um arquivo enquanto também procura novas linhas (por exemplo, eu geralmente trabalho com arquivos de log aos quais estão anexados os resultados redirecionados de processos executados periodicamente por meio de tarefas cron) é:

 tail -Fn+0 /path/to/file|grep searchterm

Isso pressupõe GNU tail e grep. Detalhes de suporte da página inicial (GNU coreutils, a minha é a v8.22)] [ https://www.gnu.org/software/coreutils /manual/coreutils.html✨ :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Portanto, a parte da cauda do meu comando é igual a tail --follow --retry --lines=+0, onde o argumento final o direciona para iniciar no início, pulando zero linhas.

2
wajiii
tail -f access | awk '/ADD/{print $0}'

Use o acima, eu uso normalmente.

1
user4553

Funciona. Mas tome cuidado para que a saída não seja mais instantânea: ela é armazenada no buffer.

0
mouviciel

Você pode usar o netcat para saudar os resultados do tail -f à medida que novos resultados chegam com bastante facilidade.

Sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Isso configura o grep para ouvir os resultados das entradas provenientes da porta 1337.
O segundo comando canaliza a saída de tail -f para o netcat e a envia localhost 1337. Para fazer isso localmente, é necessário alternar ttys para cada um dos dois conjuntos de comandos ou usar algo como tela.

0
Justin S