Tudo o que você precisa fazer é redirecionar o arquivo para wc e ele mostrará apenas o que foi adicionado e não o total.
watch wc -l < /path/to/log.log1
O < faz toda a diferença.
Existe uma maneira / ferramenta para tail ou watch um arquivo de log e relatar a quantidade de linhas que cresce?
Por exemplo Eu quero ver a quantidade de novas entradas no mysql.log a cada 3 segundos.
watch wc -l /path/to/log.log1 mostra apenas o valor acumulado. Eu prefiro não truncate o log entre.
Aqui está um perl rápido e sujo para fazer o que você quer:
#!/usr/bin/perl
open(I, "<$ARGV[0]") || die "Can't open $ARGV[0]: $!\n";
while (1) {
my $count = 0;
while (<I>) { $count++; }
print scalar(localtime()), ": $count lines\n";
sleep(3);
seek(I, 0, 1); # clear the EOF on I
}
close(I);
Aqui está a saída dele em uma janela:
[root@g3 tmp]# perl tt.pl FILE
Thu Dec 9 13:18:38 2010: 0 lines
Thu Dec 9 13:18:41 2010: 0 lines
Thu Dec 9 13:18:44 2010: 0 lines
Thu Dec 9 13:18:47 2010: 0 lines
Thu Dec 9 13:18:50 2010: 0 lines
Thu Dec 9 13:18:53 2010: 1 lines
Thu Dec 9 13:18:56 2010: 0 lines
Thu Dec 9 13:18:59 2010: 1 lines
Thu Dec 9 13:19:02 2010: 0 lines
Thu Dec 9 13:19:05 2010: 0 lines
Thu Dec 9 13:19:08 2010: 0 lines
Thu Dec 9 13:19:11 2010: 0 lines
Thu Dec 9 13:19:14 2010: 0 lines
Thu Dec 9 13:19:17 2010: 0 lines
Thu Dec 9 13:19:20 2010: 100 lines
E aqui estão os comandos que eu executei em outra janela para gerar a saída acima:
[root@g3 ~]# cd /tmp
[root@g3 tmp]# echo foo > FILE
[root@g3 tmp]# echo foo >> FILE
[root@g3 tmp]# for i in 'seq 1 100'
> do
> echo $i >> FILE
> done
[root@g3 tmp]#
Espero que ajude ...
Eu não conheço nenhuma ferramenta padrão, mas você pode usar o seguinte script Python:
import sys, time
if not len(sys.argv) >= 2:
print 'usage: %s FILENAME FREQUENCY' % (sys.argv[0])
sys.exit(1)
fd=open(sys.argv[1])
freq=int(sys.argv[2])
fd.seek(0, 2)
while True:
current = fd.tell()
nlines = len(fd.readlines())
if nlines:
print nlines
time.sleep(freq)
Para testar:
$ (while true; do echo test; sleep 0.2; done) > log & $ python watchandcount.py log 3
Não é perfeito porque não pode "monitorar" STDIN ou detectar quando o arquivo foi substituído (a opção --follow=name tail.
E aqui está um script bash:
TOTAL=0
while true; do
NEW_TOTAL=$(wc -l /path/to/log.log1 | cut -f1 -d' ')
echo $(($NEW_TOTAL - $TOTAL))
TOTAL=$NEW_TOTAL
sleep 3
done
Tem a vantagem de ser utilizável diretamente no shell, desde que você não seja alérgico a ";" ;)
TOTAL=0; while true; do NEW_TOTAL=$(wc -l TOTAL=0; while true; do NEW_TOTAL=$(wc -l big | cut -f1 -d' '); echo $(($NEW_TOTAL - $TOTAL)); TOTAL=$NEW_TOTAL; sleep 3; done | cut -f1 -d' '); echo $(($NEW_TOTAL - $TOTAL)); TOTAL=$NEW_TOTAL; sleep 3; done