grep e tail -f?

26

É 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 por esse tipo de comportamento.

    
por xenoterracide 18.10.2010 / 04:58

8 respostas

43

Usando o GNU tail e o GNU grep , posso usar tail -f usando a sintaxe direta:

tail -f /var/log/file.log | grep search_term
    
por 18.10.2010 / 05:16
7

Funcionará bem; mais geralmente, grep esperará quando um programa não estiver saindo, e continuará lendo conforme a saída chegar, então se você fizer isso:

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

Nada acontecerá por 5 segundos, depois o grep exibirá o "teste" correspondente e, cinco segundos depois, ele sairá quando o processo de canalização fizer

    
por 18.10.2010 / 05:22
6

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

tail -f foo | grep --line-buffered bar
    
por 05.02.2013 / 17:43
3

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

    
por 15.05.2011 / 15:09
2

Eu vejo todas essas pessoas dizendo para usar tail -f , mas eu não gosto das limitações disso! Meu método favorito de pesquisar um arquivo e, ao mesmo tempo, observar novas linhas (por exemplo, normalmente trabalho com arquivos de log nos quais são anexadas as saídas redirecionadas de processos executados periodicamente por meio de tarefas agendadas) é:

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

Isto assume a cauda e o grep do GNU. Detalhes de suporte do manual do tail (GNU coreutils, o meu é v8.22) [ link :

 -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.

Assim, a parte final do meu comando equivale a tail --follow --retry --lines=+0 , em que o argumento final o direciona para começar no início, ignorando as linhas zero.

    
por 15.02.2017 / 19:40
1
tail -f access | awk '/ADD/{print $0}'

Use o acima, eu uso normalmente.

    
por 07.02.2011 / 17:32
0

Você pode usar o netcat para obter os resultados de tail -f, já que novos resultados são muito fáceis.

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 escutar os resultados da entrada proveniente da porta 1337.
O segundo comando canaliza a saída de tail -f para o netcat e envia o localhost 1337. Para fazer isso localmente, você precisa mudar o ttys para cada um dos dois conjuntos de comandos, ou usar algo como a tela.

    
por 20.10.2010 / 00:23
0

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

    
por 19.10.2010 / 14:13