Tail, grep e conta as instâncias encontradas em um comando?

2

Estou acompanhando a saída de arquivos e o grep para linhas com determinados dados. Eu não quero enviar os dados para a tela, mas, em vez disso, contar o número de instâncias encontradas e enviá-las para a tela. O número de instâncias pode ser rolado e incrementado ou pode sobrescrever as existentes e apenas mostrá-las à medida que elas aumentam mais. Essa parte não é realmente importante Eu só preciso de uma contagem de instâncias em execução.

Meu comando agora é

tail -f logfile | grep 'data eu quero'

Eu tentei usar o grep -c e o wc -l, mas nada me deu os resultados que estou procurando. Esta distro particular do Linux não possui pv e não será capaz de obtê-lo. Existe uma maneira de fazer isso?

    
por user53029 23.07.2015 / 20:06

2 respostas

5

O GNU awk pode fazer isso com bastante facilidade.

Saída contínua:

tail -f logfile | grep 'stuff to grep for' | awk '{++i;print i}'

Você também pode deixar o grep e usar as expressões regulares do awk:

tail -f logfile | awk '/stuff to grep for/ {++i;print i}'

Para uma saída de linha única, você pode pré-definir um CR para que ele comece na frente da linha novamente (funciona em um console):

tail -f logfile | awk '/stuff to grep for/ {++i;printf "\r%d",i}'
    
por 23.07.2015 / 21:18
1

Existe sempre a opção watch confiável:

 watch -d grep -c "string" /path/to/file 

que é ideal quando o tamanho do seu arquivo é maior do que um par de 100 MB.

Obrigado pela sugestão do @ sa289 de usar um arquivo intermediário:

 tail -f /path/to/file |grep "string" > /tmp/intermediate-file &
 watch -d grep -c "string" /tmp/intermediate-file
    
por 23.07.2015 / 20:17