在日志中计算带有间隔的新行的数量

有没有一种方法/工具来tailwatch日志文件,并报告它增长的行数量?

例如,我想每3秒查看mysql.log中新条目的数量。

watch wc -l /path/to/log.log1只显示累计金额。 我不想truncate日志之间。

你所要做的就是将文件redirect到wc ,它只显示添加的内容而不是总数。

 watch wc -l < /path/to/log.log1 

<使所有的差异。

这里有一些快速和肮脏的Perl做你想做的事情:

 #!/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); 

下面是在一个窗口中运行的输出:

 [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 

这里是我在另一个窗口中运行的命令来生成上面的输出:

 [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]# 

希望有帮助…

我不知道任何标准的工具,但你可以使用下面的Python脚本:

导入sys,时间

如果不是len(sys.argv)> = 2:
    打印'用法:%s FILENAME FREQUENCY'%(sys.argv [0])
     sys.exit(1)

 FD =开放(sys.argv中[1])
 FREQ = INT(sys.argv中[2])
 fd.seek(0,2)
而真:
    当前= fd.tell()
     nlines = len(fd.readlines())
    如果nlines:
        打印nlines
     time.sleep(频率)

去testing:

 $(while true; do echo test; sleep 0.2; done)> log&
 $ python watchandcount.py日志3

这并不完美,因为它不能“监视” STDIN或检测文件被replace的时间( --follow=name tail的选项)。

这里是一个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 

它的优点是可以直接使用在shell,只要你不过敏“;” ;)

 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