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

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

 1#!/bin/bash
 2for (( i=0; i $date1-2011-00.tmp
 3        grep $1 $date1-2011-00.tmp|grep Check_Memory|grep COMMAND|awk -F OK: '{print $2}'|awk -F Used '{print $1}'> $date1.mem
 4        cat $date1.mem|awk '{sum+=$1} END {print "Memory-Average : ", sum/NR}' >$date1.txt
 5        echo "max memory-used:">>$date1.txt
 6        sort -unr $date1.mem |head -1 >>$date1.txt
 7        grep $1 $date1-2011-00.tmp|grep "idle"|grep "SERVICE CHECK"|awk -F idle: '{ print $2 }' >$date1.cpu
 8        cat $date1.cpu|awk '{sum+=$1} END {print "idle-Average : ", sum/NR}' >>$date1.txt
 9        echo "min idle-used:">>$date1.txt
10        sort -un $date1.cpu |head -1 >>$date1.txt
11        rm -rf $date1-2011-00.tmp $date1.mem $date1.cpu
12        mv /usr/local/nagios/var/archives/*.txt /home/nagios/test
13done

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

1Memory-Average :  18.9783
2max memory-used:
3 20%
4idle-Average :  95.1858
5min idle-used:
6 92.32

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

1Memory-Average:18.9301
2max memory-used:19%
3idle-Average:95.3885
4min idle-used:92.77

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

1cat 10-31.txt | sed '/max/{N;s/n//}'
2cat 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}}’ 进行处理,有多个匹配内容时,可以用|,不过前面最好加转义。 该名我使用的代码为

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

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

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

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

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

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