1

我正在观看一个带时间戳的日志文件。每隔一段时间,日志就会写一条消息,“OK”

我怎样才能捕获每秒写入的“OK”数?例如输出像

10.5 OK/sec
9 OK/sec
20 OK/sec

日志很大,对整个文件执行 grep 是不切实际的。我从

tail -f my.log | grep OK

这很有帮助,但并不能完全让我明白这一点。

谢谢!

下面的第一个解决方案很棒(其他也很好),我对其进行了一些修改,这就是我想出的

tail -f my.log | perl -lne 'if(/(\d+:\d+:\d+).*OK/) { print $1; }'| uniq -c
4

2 回答 2

3

当您的日志格式如下:

Wed Jul 10 22:44:00 CEST 2013 OK
Wed Jul 10 22:44:00 CEST 2013 OK
Wed Jul 10 22:44:00 CEST 2013 OK
Wed Jul 10 22:44:00 CEST 2013 OK
Wed Jul 10 22:44:01 CEST 2013 OK
Wed Jul 10 22:44:01 CEST 2013 OK
Wed Jul 10 22:44:01 CEST 2013 OK
Wed Jul 10 22:44:01 CEST 2013 OK
Wed Jul 10 22:44:01 CEST 2013 OK
Wed Jul 10 22:44:01 CEST 2013 OK
Wed Jul 10 22:44:01 CEST 2013 OK
Wed Jul 10 22:44:01 CEST 2013 OK

因此,在 form 中timestamp OK,您可以尝试简单的:

tail -f logfile | uniq -c

你会得到下一个结果:

4 Wed Jul 10 22:44:00 CEST 2013 OK
8 Wed Jul 10 22:44:01 CEST 2013 OK 
^
+---- number of OK in the same timestamp
于 2013-07-10T20:52:03.477 回答
1

这是一个快速的脚本来做到这一点:

#! /bin/bash
log="/var/log/messages"
seconds="1"
filter="OK"

while true; do
    echo "$(timeout $seconds tail -n0 -f $log|grep $filter|wc -l) OK/sec" 
done

有一点竞争条件,它可能会在循环期间丢失一两行,但不太可能。此外,并非每个 Linux 发行版都timeout默认安装,因此您可能需要检查一下。

于 2013-07-10T20:39:51.870 回答