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; }'
输出如下
image.png
这里的语法是这样的
-
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
皆失败
最后尝试一下输出到文件
image.png
我们来看下 文件里存的到底是啥
image.png
看到 39
49m
了吗?
之前玩过一次windows控制台字体颜色,好像就是设置这些东东
再回想一下前面的输出,这个数字是粗体的,而命令是 正常字体的
image.png
所以只要让top 不输出粗体,应该就可以了
最后想起来看到有的博客,top
后面加了一个 -b
,而粗体的英文是 blob
,那么这个命令是不是取消粗体的意思呢?
试一下
image.png
可以看到加了-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 (`内存`使用率)
网友评论