如何测量文件中新行的比率(日志文件)

我试图获得一段时间内的日志文件写操作,理想情况下是当前的速率和1分钟,5分钟和15分钟的平均值。

我可以做这样的事情:

watch wc -l /var/log/<my_file> 

呃,自己计算一下吧。 我可以写一个快速的脚本。 但是我深信,在我的内心深处,我错过了一些显而易见的东西。是不是有这样的东西呢?

Logtop在这里可能对你有用。

也是pipe道查看器 。

其他一些有趣的想法也在这里 。

 FILE=/var/log/syslog DELAY=10 BEFORE=$(wc -l ${FILE}|cut -f1 -d' ') sleep ${DELAY} AFTER=$(wc -l ${FILE}|cut -f1 -d' ') echo $(($AFTER - $BEFORE)) 

给你一个10秒内添加的行数。

cat / var / log / myfile | while((((index ++)%5)== 0)){sms / chat-session / whatever}

更新 :实际的一般工作代码:

 dmesg | while true; do <br> if [ $(( $(( index++ )) % 5 )) -eq 0 ]; then nc -p srcport --send-only hostname port or arduino ...:P sms/write/chat-session/whatever; fi done 

在某些情况下snmp可能是一个更有用的想法。

使用wc是小文件的一个很好的解决scheme,但是当你有大的日志文件的时候它会中断。 为了解决这个问题,我们将使用fifo来存储文件中的新数据和一些控制数据。

 mkfifo /tmp/line_counter 

然后,我们将发送一个包含一个0字符的日志文件的每行的fifo一行(我们不需要完整的行)。 我们需要在这里使用sed unbuffered( -u )来保持输出的实时性。 这个工作放在后台来保持shell可用,所以我们记住它的pid在一个文件中:

 tail -f -n 0 your_log_file | sed -u -e 's/.*/0/' >> /tmp/line_counter & echo $! > /tmp/line_counter_tail_sed_pid 

然后,我们需要一个在fifo中的定时器,在后台:

 while true; do echo 1 >> /tmp/line_counter; sleep 1; done & echo $! > /tmp/line_counter_timer 

那么,有趣的部分,让我们用awk读取fifo:

 cat /tmp/line_counter | awk -W interactive '$0 == "0" {line++} $0 == "1" {count[time % (60*15)]=line; time++; printf "Time %6d: %6d lines read.\n", time, line} $0 == "1" && time > 60 {printf "%6d lines read in the last minute.\n", count[(time-1) % (60*15)] - count[(time-1-60) % (60*15)]} $0 == "1" && time > 60*5 {printf "%6d lines read in the last 5 minutes.\n", count[(time-1) % (60*15)] - count[(time-1-60*5) % (60*15)]} $0 == "1" && time > 60*15 {printf "%6d lines read in the last 15 minutes.\n", count[(time-1) % (60*15)] - count[(time-1-60*15)% (60*15)]}' 

cat-W interactive是需要对抗缓冲区。

当你完成后,CTRL-C awk和:

 kill $(cat /tmp/line_counter_timer) kill $(cat /tmp/line_counter_tail_sed_pid) rm /tmp/line_counter /tmp/line_counter_timer /tmp/line_counter_tail_sed_pid