Isso é possível usar grep
em um fluxo contínuo?
O que quero dizer é uma espécie de tail -f <file>
comando, mas com grep
na saída, a fim de manter apenas as linhas que me interessam.
Eu tentei tail -f <file> | grep pattern
mas parece que grep
só pode ser executado uma vez tail
acabamentos, isto é, nunca.
Respostas:
para resposta № 1Ligar grep
"s modo de buffer de linha ao usar o BSD grep (FreeBSD, Mac OS X etc.)
tail -f file | grep --line-buffered my_pattern
Você não precisa fazer isso para o GNU grep (usado em praticamente qualquer Linux), pois ele será liberado por padrão (YMMV para outros tipos de Unix, como SmartOS, AIX ou QNX).
104 para resposta № 2
Eu uso o tail -f <file> | grep <pattern>
o tempo todo.
Ele irá esperar até que o grep seja liberado, não até que termine (eu estou usando o Ubuntu).
50 para a resposta № 3
Eu acho que o seu problema é que o grep usa algum buffer de saída. Experimentar
tail -f file | stdbuf -o0 grep my_pattern
ele irá configurar o modo de buffer de saída do grep para unbuffered.
5 para resposta № 4
Na maioria dos casos, você pode tail -f /var/log/some.log |grep foo
e vai funcionar muito bem.
Se você precisar usar vários greps em um arquivo de log em execução e descobrir que não obtém nenhuma saída, pode ser necessário --line-buffered
mudar para o seu meio grep (s), assim:
tail -f /var/log/some.log | grep --line-buffered foo | grep bar
4 para a resposta № 5
Se você quiser encontrar correspondências no inteira arquivo (não apenas o rabo), e você quer que ele se sente e espere por novos jogos, isso funciona muito bem:
tail -c +0 -f <file> | grep --line-buffered <pattern>
o -c +0
bandeira diz que a saída deve começar 0
bytes (-c
) do começo (+
) do arquivo.
1 para resposta № 6
você pode considerar essa resposta como aprimoramento ... geralmente estou usando
tail -F <fileName> | grep --line-buffered <pattern> -A 3 -B 5
-F é melhor em caso de rotação de arquivo (-f não funcionará corretamente se o arquivo for girado)
-A e -B é útil para obter linhas antes e depois da ocorrência do padrão. Esses blocos aparecerão entre os separadores de linhas tracejadas.
0 para resposta № 7
Sim, isso vai funcionar muito bem. Grep
e a maioria dos comandos Unix operam em streams de uma linha por vez. Cada linha que sai da cauda será analisada e transmitida se corresponder.
0 para a resposta № 8
Não vi ninguém oferecer o meu habitual para isso:
less +F <file>
ctrl + c
/<search term>
<enter>
shift + f
Eu prefiro isso, porque você pode usar ctrl + c
para parar e navegar pelo arquivo sempre, e depois é só apertar shift + f
para retornar à pesquisa ao vivo e em fluxo contínuo.
-1 para resposta № 9
sed seria o comando adequado (corrente editor)
tail -n0 -f <file> | sed -n "/search string/p"
e, em seguida, se você quiser que o comando tail saia assim que encontrar uma string específica:
tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n "/search string/{p; q}"
Obviamente, um bashumano: $ BASHPID será o id do processo do comando tail. O comando sed é o próximo após a cauda no pipe, portanto, o id do processo sed será $ BASHPID + 1.
-2 para resposta № 10
Use o awk (outro grande utilitário do bash) em vez do grep, onde você não tem a opção de buffer de linha! Ele irá transmitir continuamente seus dados da cauda.
é assim que você usa o grep
tail -f <file> | grep pattern
É assim que você usaria o awk
tail -f <file> | awk "/pattern/{print $0}"