É possível fazer um tail -f
(ou semelhante) em um arquivo e grep
ao mesmo tempo? Eu não me importaria com outros comandos apenas procurando esse tipo de comportamento.
É possível fazer um tail -f
(ou semelhante) em um arquivo e grep
ao mesmo tempo? Eu não me importaria com outros comandos apenas procurando esse tipo de comportamento.
Respostas:
Funcionará bem; de uma maneira mais geral, grep
esperará quando um programa não estiver sendo exibido e continuará lendo quando a saída chegar; portanto, se você:
$ (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
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
grep
não vai para um terminal (redirecionado para outro tipo de arquivo). buffer de linha é o padrão quando a saída vai para um terminal, para que não faça nenhuma diferença lá. Observe que essa opção é específica do GNU.
Você pode apenas canalizar a saída grep
paratail -f
. Existem também programas que combinam tail -f
funcionalidade com filtragem e coloração, em particular multitail ( exemplos ).
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 por 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 assume o GNU tail e grep. Detalhes de suporte da página de manual da cauda (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 tail --follow --retry --lines=+0
final do meu comando é igual a , onde o argumento final o direciona para começar no início, pulando zero linhas.
tail -f access | awk '/ADD/{print $0}'
Use o acima, eu uso normalmente.
Você pode usar o netcat para receber 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 use algo como tela.
Funciona. Mas tome cuidado para que a saída não seja mais instantânea: ela é armazenada no buffer.
tail -f
em uma janela e tail -f logfile | grep pattern
na outra janela. As linhas que contêm pattern
nem sempre aparecem nas duas janelas ao mesmo tempo. Eu vi linhas aparecerem com 30 segundos de intervalo em raras ocasiões, o que era irritante.
tee
ou algo assim.