awk不能从系统负载值提取cpu利用率,因二者概念不同;但可从top、/proc/stat、ps等输出中提取cpu占比:如top -b -n 1 | awk '/cpu\(s\)/ {print $2,$4,$8}'提取us/sy/id,或解析/proc/stat计算整体使用率,或用ps auxw筛选进程级cpu占用。

Linux 中用 awk 提取系统负载里的 CPU 利用率,关键在于明确“系统负载”和“CPU 利用率”不是一回事——很多人会混淆:
-
系统负载(Load Average):反映的是就绪队列中平均等待 CPU 或 I/O 的进程数(
uptime或top顶部显示的 1/5/15 分钟值),不是百分比,也不直接等于 CPU 使用率; -
CPU 利用率:指 CPU 时间被实际占用的比例(如
us用户态、sy内核态、id空闲等),通常来自top -b -n 1或/proc/stat。
所以严格来说,awk 不能从“负载值”里提取“CPU 利用率”,但它可以从 top、vmstat、/proc/stat 等含 CPU 时间占比的原始输出中精准提取利用率字段。以下是几种典型且实用的方式:
提取 top 命令中的各项 CPU 占比
top -b -n 1 输出首行含汇总 CPU 使用统计(如 Cpu(s): 12.3%us, 2.1%sy, 0.0%ni, 84.9%id, 0.7%wa...),用 awk 按字段切分提取:
top -b -n 1 | grep "Cpu(s)" | awk -F',' '{print $1}' | awk '{print $2}' | sed 's/%us//'
→ 得到用户态 CPU 百分比(如 12.3)
更简洁通用写法(一次 awk 完成):
top -b -n 1 | awk '/Cpu\(s\)/ {gsub(/%|us|sy|id|wa|ni|hi|si/, "", $2); print $2, $4, $8}' | awk '{print "us:" $1 "% sy:" $2 "% id:" $3 "%"}'
输出类似:us:12.3% sy:2.1% id:84.9%
从 /proc/stat 计算瞬时 CPU 利用率(更准确)
/proc/stat 第一行 cpu 行记录各状态累计 jiffies,需两次采样差值计算。但若只需快速估算,可用单次近似(适用于低精度监控):
# 获取第一行 cpu 总时间及各状态
awk '/^cpu / {u=$2; n=$3; s=$4; i=$5; w=$6; x=$7; y=$8; z=$9; total=u+n+s+i+w+x+y+z; idle=i; printf "%.1f%\n", (total-idle)/total*100}' /proc/stat
→ 输出整体 CPU 使用率(如 15.4%)
提取特定进程的 CPU 占用率(ps + awk)
查看某个进程(如 nginx)当前 CPU 百分比:
ps auxw | awk '$11 ~ /nginx/ {print $3 "%"}' | head -1
或精确匹配进程名(排除 grep 自身):
ps auxw | awk '!/awk/ && /nginx/ {print $3 "%"}' | head -1
用 awk 做多条件筛选(比如高 CPU + 高内存进程)
结合 ps aux 输出,同时抓 CPU > 20% 且内存 > 10% 的进程:
ps auxw | awk '$3 > 20 && $4 > 10 {printf "PID:%s CMD:%s CPU:%s%% MEM:%s%%\n", $2, $11, $3, $4}'
注意:ps auxw 中 $3 是 %CPU,$4 是 %MEM,列号固定,可放心引用。
不复杂但容易忽略:top 默认输出含转义控制符,批量脚本中务必加 -b(批处理模式);ps 输出列顺序在不同系统可能微调,建议先 ps auxw | head -1 确认列含义。











