有时候我们需要统计系统中某一个程序的CPU利用率来做监控,而这个程序可能有多个进程或者多个线程,我们可以先匹配到该程序的所有进程或者线程,然后计算所有线程或者进程的CPU利用率的和,从而算出该程序的CPU总的利用率。

下面我们以nginx程序为例。

root@localhost:# ps aux | grep nginx |grep -v grep |awk '{sum+=$3;}END{print sum}'
0

如果要统计mysql所有进程的CPU利用率,则将nginx换成mysql即可。

上面的命令用到了awk编程。

awk '{sum+=$3;}END{print sum}'

这里是自定义一个变量sum,并且使sum=$sum+$3。最后计算sum的结果。



上面的命令使用grep来匹配nginx关键字,其实也可以直接使用awk的PATTERN用法来匹配。

语法为:awk [option] '/PATTERN/ {ACTION}'  /path/to/file

root@localhost:~/shell_test# ps aux  |awk '/nginx/ {sum+=$3;}END{print sum}'      
0

但是这个命令有一点问题,就是awk这条命令本身也会被模式匹配到。看下面的命令:

root@localhost:~# ps aux  |awk '/nginx/ {print }'      
root      4969  0.0  0.0  65248  1372 ?        Ss   May26   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     4970  0.0  0.1  65788  2192 ?        S    May26   0:00 nginx: worker process                   
nginx     4971  0.0  0.1  65788  1940 ?        S    May26   0:06 nginx: worker process                   
nginx     4972  0.0  0.1  65788  1940 ?        S    May26   0:06 nginx: worker process                   
nginx     4973  0.0  0.1  65788  1940 ?        S    May26   0:06 nginx: worker process                   
nginx     4974  0.0  0.0  65472  1740 ?        S    May26   0:00 nginx: cache manager process            
root     18698  0.0  0.0 105948  1064 pts/0    R+   17:15   0:00 awk /nginx/ {print }

最后一条是awk命令本身,需要去掉。可以用awk的模糊匹配或者精确匹配进行过滤

模糊匹配

'$11 ~ /nginx/’
root@localhost:~# ps aux |awk '$11 ~ /nginx/ {print}'
root     11766  0.0  0.0  65248  1248 ?        Ss   10:42   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    11767  0.0  0.0  65788  1872 ?        S    10:42   0:00 nginx: worker process                   
nginx    11768  0.0  0.1  65788  1936 ?        S    10:42   0:00 nginx: worker process                   
nginx    11770  0.0  0.1  65788  1936 ?        S    10:42   0:00 nginx: worker process                   
nginx    11771  0.0  0.1  65788  1936 ?        S    10:42   0:00 nginx: worker process                   
nginx    11772  0.0  0.0  65472  1736 ?        S    10:42   0:00 nginx: cache manager process            
nginx    11773  0.0  0.0  65472  1636 ?        S    10:42   0:00 nginx: cache loader process

精确匹配

'$11=="nginx:"’
root@localhost:~# ps aux |awk '$11=="nginx:"{print}'
root     11766  0.0  0.0  65248  1376 ?        Ss   10:42   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    11767  0.0  0.1  65788  1936 ?        S    10:42   0:00 nginx: worker process                   
nginx    11768  0.0  0.1  65788  1936 ?        S    10:42   0:00 nginx: worker process                   
nginx    11770  0.0  0.1  65788  1936 ?        S    10:42   0:00 nginx: worker process                   
nginx    11771  0.0  0.1  65788  1936 ?        S    10:42   0:00 nginx: worker process                   
nginx    11772  0.0  0.0  65472  1736 ?        S    10:42   0:00 nginx: cache manager process


反向匹配:

'$11 !~ /nginx/'


大小写匹配
 awk '/[zZ]eng/'  filename     #匹配含有zeng 或是Zeng的字符串

在awk中使用条件操作符
<     小于        >=    大于等于
< =    小于等于    ~    匹配正则表达式
==    等于        !~    不匹配正则表达式
!=    不等于