说明蓝色=命令名称

      浅绿=命令参数

      浅蓝=选项

      紫色=目录

      系统环境:CentOS  5.8  x86_64

  朋友让帮谢了一个生成报表的shell,感觉很有意思发出来大家讨论讨论。

总共三个文件如下图:

iplist

 
  
  1. #group1 
  2. 192.168.1.1 
  3. 192.168.1.2 
  4. #group2 
  5. 192.168.1.3 
  6. 192.168.1.4 

myreport.sh

 
  
  1. #!/bin/bash 
  2. vmstat 1 2|awk '{cpuidel=$(NF-2);iowait=$(NF-1)}END{printf("cpuidel=%s iowait=%s",cpuidel,iowait)}' 
  3. awk '{printf " loadavg="$1}' /proc/loadavg  
  4. awk -F"[ :]+" 'NR==5{printf " swap="$2/1024}' /proc/meminfo 
  5. netstat -an|awk '/^tcp/{a[$6]++}END{printf " max_conn="a["ESTABLISHED"]}' 
  6. printf "\n" 

report.sh

 
  
  1. #!/bin/bash 
  2.  
  3. export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/usr/local/php/bin:/root/bin:/home/tangweizhong/shell/bin 
  4. DATE=`date +%F` 
  5. MONTH=`date +%m` 
  6. YEAR=`date +%Y` 
  7. rm -f system-report-$DATE.html 
  8. for ip in `awk 'BEGIN{RS="#";FS="\n"}NR>1{i=1;while(++i<NF)print $1"="$i}' iplist` 
  9. do 
  10.     printf "%s " ${ip%=*} 
  11.     printf "%s " ${ip#*=} 
  12. sh myreport.sh 
  13. done |awk ' 
  14. BEGIN{ 
  15.     warn["max_conn"]=2 
  16.     warn["swap"]=5 
  17.     FS="[ =]" 
  18. a[$1,NR,"ip"]=$2 
  19. b[$1,"1"]="ip" 
  20. c[$1] 
  21. for(i=3;i<NF;i++){ 
  22.     j=i 
  23.     b[$1,i]=$i 
  24.     a[$1,NR,$j]=$(++i) 
  25.     } 
  26. END{ 
  27.     step=1 
  28.     print "<html>
  29.     print "<body>
  30.     for(group in c){ 
  31.         print "<h1>"group" SYSTEM REPORT</h1>
  32.         step+=(NR/length(c)) 
  33.         print "<table>
  34.         for(i=1;i<NF;ii=i+2){ 
  35.             print "<tr>
  36.             print "<td Bgcolor=#FFCC33 align=right >"b[group,i]"</td>
  37.             for(j=step-NR/length(c);j<step;j++){ 
  38.                 if(warn[b[group,i]]>0&&a[group,j,b[group,i]]>warn[b[group,i]]){ 
  39.                     print "<td Bgcolor=red align=right>"a[group,j,b[group,i]]"</td>
  40.                 }else{ 
  41.                     print "<td Bgcolor=#CCFFFF align=right>"a[group,j,b[group,i]]"</td>
  42.                 } 
  43.             } 
  44.             print "</tr>
  45.         } 
  46.         print "</table>
  47.     }    
  48.     print "</body>
  49.     print "</html>
  50. }' >> system-report-$DATE.html 

效果如图:

结束语:脚本是我随便写的,这里只是感觉这个思路不错,以前都是用python,没有想过shell也可以做到。根据这个思路可以自己定义各种表表,效果更加直观,比光看数据好多了。

 补充:

 
  
  1. awk '/CPU.*idle/{ 
  2.     while(1){ 
  3.         getline; 
  4.         if($NF){ 
  5.             idle=$6>idle?$NF:idle; 
  6.             iowait=$5>iowait?$5:iowait 
  7.         }else  
  8.             break 
  9.         } 
  10.     }/run/{ 
  11.     while(1){ 
  12.         getline; 
  13.         if($0!=""&&NR!=a){ 
  14.             loadavg=$NF>loadavg?$NF:loadavg 
  15.         }else{ 
  16.             break 
  17.             } 
  18.         ;a=NR 
  19.         } 
  20.     }/IFACE.*rxmcst/{ 
  21.     while(1){ 
  22.         getline; 
  23.         if($0!=""){ 
  24.             rxbyt=$5>rxbyt?$5:rxbyt; 
  25.             txbyt=$6>txbyt?$6:txbyt}else break 
  26.         } 
  27.     }/kbmemfree/{ 
  28.     while(1){ 
  29.         getline;if($0!=""){ 
  30.         swap=$9>swap?$9:swap 
  31.     }else  
  32.         break 
  33.     } 
  34. }END{ 
  35. printf("idle=%s iowait=%s loadavg=%s rxbyt=%s txbyt=%s swap=%s\n",idle,iowait,loadavg,rxbyt,txbyt,swap) 
  36. }' 报表文件 

本脚本用来分析sar 报表,可配合上面脚本数据源。

效果图: