/ / Como 'grep' um fluxo contínuo? - linux, bash, shell, grep, cauda

Como "grep" um fluxo contínuo? - linux, bash, shell, grep, cauda

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 № 1

Ligar 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}"