0x1 概述
最近想通过 linux
shell
得到 CPU
使用率
查了一些文档,也踩了一些坑
记录下来,分享给大家
0x2 top の 1
想法是通过 top
命令得到 CPU
使用率
输入top
,我们看下有什么信息

0x3 top 参数、含义、思路
查了一下top
的参数, -n
参数的意思是 刷新一次就停止(只输入top
是会一直在刷新的)
Cpu
这一行有很多参数
us
是用户空间占比
sy
是内核态占比
id
是空闲占比
还有其它的都是各种场景的使用占比
所以我们是取出 id
, 然后 100-id
0x4 awk
0x4.1 先把 Cpu
这一行给切出来
top -n1 | fgrep "Cpu(s)" | tail -1

0x4.2 对于这一行,从 id,
这里给切开
top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{ printf "%s", $1; }'
输出如下
[root@cf6d9e5767eb94c7e857cd35600149344-node1 ~]# top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{ printf "%s", $1; }'
%Cpu(s): 1.6 us, 1.6 sy, 0.0 ni, 96.8
0x4.3 然后用 英文逗号再次切一下,取最后一个数字
top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; printf "%s", v; }'
输出如下

这里的语法是这样的
-
split($1, vs, ",")
把$1
用,
切割成数组,存到变量vs
里,$1
长什么样子已经在0x4.2
里输出了 -
v=vs[length(vs)]
这是常见的取数组最后一个元素的语法
0x4.4 把输出的两端的空格删掉
top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%s", v; }'

0x4.5 然后就是愉快的数学运算了
top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%s", 100-v; }'

纳尼?为何v变成了0?
搜索了一下,在运算的时候,awk
里面不能被转为数字的字符串会变成数字0
接下来就是一段漫长的搜索资料和重试过程。。。
0x5 入坑、识坑、出坑
在awk
这里把 字符串转为数字,尝试了各种玩法,包括 substr
sub
,不行
设置为变量
重新用管道重定向到另外一个 awk
皆失败
最后尝试一下输出到文件

我们来看下 文件里存的到底是啥

看到 39
49m
了吗?
之前玩过一次windows控制台字体颜色,好像就是设置这些东东
再回想一下前面的输出,这个数字是粗体的,而命令是 正常字体的

所以只要让top 不输出粗体,应该就可以了
最后想起来看到有的博客,top
后面加了一个 -b
,而粗体的英文是 blob
,那么这个命令是不是取消粗体的意思呢?
试一下

可以看到加了-b
之后,没有粗体了
最后
top -b -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%s\n", 100-v; }'

ext
分享一下 计算CPU和内存、ip等数据的shell脚本
#!/bin/bash
# 得到ip
ip=`ip addr show eth0 | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print ""$2 }'`
echo $ip
ip_index=`echo $ip | awk -F '.' '{print $4}'`
#计算cpu使用率
cpu=`top -b -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%d", 100-v;}'`
echo $cpu
#统计内存使用率
mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`
echo $mem_used_persent
输出(我用了 %d
,所以最后输出的都是整数
,大家可以使用 %f
自行调整)
172.18.237.171 (`eth0`的`ip`地址)
12 (`cpu`使用率)
56 (`内存`使用率)
网友评论