牛X的正则表达式——从nagios中提取数据的过程

最近应移动要求要提取每天的系统负载情况。其包括每天的CPU、内存的最高使用情况和平均使用情况,load average平均1、5、15分钟的负载!刚好公司的nagios的监控日志能提到数据。不过nagios日志里都是像下图中的数据。

<img src="https://www.361way.com/wp-content/uploads/2011/11/screenshot2.bmp" width="927" height="281" alt="" />

显然无法直接汇制成表格按月提取 ,因为里面数据量挺大。有全国几十个区域的数据。所以就先用一个脚本把需要的数据过滤出来,放到一个.txt文件里。脚本如下:

#!/bin/bash
for (( i=0; i<31; i++)); do
        cd /usr/local/nagios/var/archives
        date1=$(date +%m-%d --date "$i days ago")
        logview nagios-$date1-2011-00.log > $date1-2011-00.tmp
        grep $1 $date1-2011-00.tmp|grep Check_Memory|grep COMMAND|awk -F OK: '{print $2}'|awk -F Used '{print $1}'> $date1.mem
        cat $date1.mem|awk '{sum+=$1} END {print "Memory-Average : ", sum/NR}' >$date1.txt
        echo "max memory-used:">>$date1.txt
        sort -unr $date1.mem |head -1 >>$date1.txt
        grep $1 $date1-2011-00.tmp|grep "idle"|grep "SERVICE CHECK"|awk -F idle: '{ print $2 }' >$date1.cpu
        cat $date1.cpu|awk '{sum+=$1} END {print "idle-Average : ", sum/NR}' >>$date1.txt
        echo "min idle-used:">>$date1.txt
        sort -un $date1.cpu |head -1 >>$date1.txt
        rm -rf $date1-2011-00.tmp $date1.mem $date1.cpu
        mv /usr/local/nagios/var/archives/*.txt /home/nagios/test
done 

因为后来load average的内容不需要了,所认把load average提取的代码给删了,需要的话可以根据上面的内容加。文件保存为shell.sh吧!使用方法为./shell.sh 主机名。我这里是./shell  ZJ-db1 。这样shell就完成了最近30天数据的提取,统一保存为每天的日期.txt。如10-31.txt。
而取得的内容为:

Memory-Average :  18.9783
max memory-used:
 20%
idle-Average :  95.1858
min idle-used:
 92.32

显然这样导到excel里很麻烦。我们可以再进行下转换。可以先将所有的数据进行下方便excel导的格式:
首先修改为以下格式,这里就要用到牛X的正则表达式了。

Memory-Average:18.9301
max memory-used:19%
idle-Average:95.3885
min idle-used:92.77

要转换为上面的格式,可以利用下面两个语句中的任一个实现。另外可以再加上for循环转换所有文件为上面的格式。

cat 10-31.txt | sed '/max/{N;s/n//}'
cat 10-31.txt|awk '{if(/min/){printf $0" ";next} else{print}}'

注:当然也可以两行同时匹配代码为cat 10-31.txt | sed ‘/max|min/{N;s/n//}’和
cat 10-31.txt|awk ‘{if(/min|/){printf $0″ “;next} else{print}}’   进行处理,有多个匹配内容时,可以用|,不过前面最好加转义。
该名我使用的代码为

for i in `ls *.txt`;do sed -i '/max|min/{N;s/n//}' $i;done  

转换完成后,一个一个导还是不方便,要导入30多次,这时可以利用下awk ‘{ print $0 ,FILENAME}’该语名将所有的文件本日期加在最后,开成的格式就会如下面的样式。

Memory-Average:18.9301 10-13.txt
max memory-used:19%  10-13.txt
idle-Average:95.3885 10-13.txt
min idle-used:92.77 10-13.txt

如果感觉看起来不美观的话,还可以使用column和sed命令进行处理将.txt去掉,将三个列之间以:分开,并且按列对齐排列。这里就不详细介绍了。完了一个,形成的这一个文档就可以很方便的导入excel,再利excel的强大公式功能。进行增长率之类的计算了。我的最后的处理脚本是:

for i in `ls *.txt`;do sed -i '/max|min/{N;s/n//}' $i;awk '{ print $0 ,":",FILENAME}' $i>>test.test;done

当然,也可以可前面第一个取数据的脚本合并,这样一个脚本取出所有数据后,再通过excel公式处理。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注