如何在 Linux 命令行中获取 CPU 占用率
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 (`内存`使用率)
推荐阅读
-
` 自动填充为 `cp test.txt`
- 文件和目录名补全:输入文件名首字母后按 Tab,如 `vi ed
` 显示可用的编辑器列表 - 查看命令帮助: - 使用 `man` 命令配合具体命令名获取详尽帮助,如 `man ls` 或者 `man grep --help`"> 在 Linux 中操作指令指南 - 基本构造与种类 - 指令组成: 1. **主指令 + 选项 + 参数**: 如 `ls -l /home`,`main-action option object` - 内置指令:系统预装的 shell 功能,如 `cd`, `pwd` - 外部指令:独立可执行文件,直接用文件名当作命令,如 `rm`, `mv` - **选项与参数**: - 选项:定制命令行为, `-l` 或 `--long-help` - 短选项:简写形式,例如 `-v` 和 `-V` 可能合并使用 - 长选项:详细描述的选项,如 `--version` 或 `--human-readable` - 参数:命令作用的目标,如 `ls` 对 `/home` 目录的操作 - **指令应用**: - 不同指令需要不同的参数 - 选项可带或不带参数,比如 `grep -i "keyword"` (忽略大小写搜索) - 参数间通常用空格分隔,如 `cp file1 file2 file3` - **中断与完成提示**: - 终止当前指令:按下 Ctrl+C - **自动完成**: - 输入部分命令关键词后,按 Tab 键补全命令,如 `cp ta
` 自动填充为 `cp test.txt` - 文件和目录名补全:输入文件名首字母后按 Tab,如 `vi ed ` 显示可用的编辑器列表 - 查看命令帮助: - 使用 `man` 命令配合具体命令名获取详尽帮助,如 `man ls` 或者 `man grep --help` -
如何在 Linux 命令行中获取 CPU 占用率