Como observar a contagem de novas linhas na cauda

9

Eu quero fazer algo assim:

watch tail -f | wc -l
#=> 43
#=> 56
#=> 61
#=> 44
#=> ...

Conta novas linhas de cauda a cada segundo

/ Linux, CentOs

Para ser mais claro. Eu tenho algo parecido com isto:

tail -f /var/log/my_process/*.log | grep error

Estou lendo algumas mensagens de erro. E agora eu quero contá-los. Quantos erros eu tenho em um segundo. Portanto, uma linha em um log é um erro em um processo.

fl00r
fonte
O que você está tentando fazer? Se você deseja assistir linhas anexadas, basta usá-lo tail -f /path/to/filesozinho. Se você quiser assistir às linhas do arquivo, pode usar watch wc -l /path/to/file.
Khaled
@Khaled, eu preciso assistir quantas novas linhas foram acrescentados
fl00r
Eu uso cauda com regex para uma série de arquivos, e eu quero ver quantas linhas são anexados a todos estes arquivos através de uma vez
fl00r
1
Hmpfh. tail -f /var/log/my_process/*.log |grep error > /tmp/error.lines & ; watch wc /tmp/error.lines? Então faça contas.
Cjc 22/10/12
@cjc funciona, obrigado! :) você deve para ele como ab resposta
fl00r

Respostas:

24

Eu descobri recentemente o PV, e é muito legal, você poderia fazer algo como

tail -f logfile | pv -i2 -ltr > /dev/null

  • -i2 = conta a cada 2 segundos
  • -l = linhas de contagem
  • -t = tempo de impressão
  • -r = taxa de exibição
javipolo
fonte
3

Aqui está um método rápido e sujo. Você basicamente quer quebrar o taile watch wcem partes separadas, e fazer algo como:

tail -f /var/log/my_process/*.log |grep error > /tmp/error.lines &
watch wc /tmp/error.lines

Nesse ponto, você pode fazer contas para obter um número de erros / s. Mas, se você estiver fazendo isso apenas para um exame pontual da sua taxa de erro, o uso rápido e sujo pode ser bom o suficiente.

cjc
fonte
3

Caso o pv não esteja disponível, isso pode ser feito com o perl:

A cada segundo:

tail -f  recycleBack*out  | perl -e 'while (<>) {$l++;if (time > $e) {$e=time;$i++;print "$i=> $l\n";$l=0}}'

A cada 10 segundos

tail -f  recycleBack*out  | perl -e 'while (<>) {$l++;if (time > $e+10) {$e=time;$i++;print "$i=> $l\n";$l=0}}'

Saída de amostra:

1=> 1
2=> 1523
3=> 1339
4=> 1508
5=> 1785
6=> 1587
7=> 1770
8=> 1432
9=> 1339
10=> 1555
11=> 1663
12=> 1693
13=> 1647
aprodan
fonte
-1

Você pode tentar algo como isto:

tail -f /var/log/my_process/*.log | perl -pe '$_ = "$. $_"'

Imprime o número da linha na frente de cada linha.

Finlandês
fonte
1) Não é isso que o OP está procurando e 2) nlfará isso, não exigindo a chamada para perl.
EEAA