#!/bin/bash

PREV_TOTAL=0 #存储CPU总时间
PREV_IDLE=0 #存储CPU空闲时间

while true; do

#读取CPU统计数据并累加到TOTAL变量
CPU=($(sed -n 's/^cpu\s//p' /proc/stat))
IDLE=${CPU[3]}
TOTAL=0

for VALUE in "${CPU[@]:0:8}"; do
TOTAL=$((TOTAL+VALUE))
done

#计算当前与上一次的CPU总时间差并4舍5入
DIFF_IDLE=$((IDLE-PREV_IDLE))
DIFF_TOTAL=$((TOTAL-PREV_TOTAL))
DIFF_USAGE=$(((1000*(DIFF_TOTAL-DIFF_IDLE)/DIFF_TOTAL+5)/10))

#打印使用率并更新变量以供下一次使用
echo -en "\rCPU: $DIFF_USAGE% \b\b"
PREV_TOTAL="$TOTAL"
PREV_IDLE="$IDLE"

sleep 1
done


sed 是一个流编辑器,用于对文本进行处理。命令 sed -n 's/^cpu\s//p' /proc/stat 的意思是:

  • sed: 调用流编辑器。
  • -n: 告诉 sed 不要自动打印每一行。
  • 's/^cpu\s//p': 这是传递给 sed 的脚本。
    • s: 表示替换操作。
    • /^cpu\s//: 这是替换的模式。^ 表示行的开始,cpu 是要查找的字符串,\s 表示空白字符(如空格、制表符等),// 表示查找模式的结束。
    • p: 表示打印(print)。
  • /proc/stat: 这是 sed 要处理的文件。/proc/stat 是一个伪文件系统,其中包含了系统的状态信息,包括 CPU 的使用情况。

所以,这个命令的意思是:使用 sed 来处理 /proc/stat 文件,查找以 “cpu” 开头的行,然后删除这些行开头的 “cpu” 和随后的空白字符,并打印这些行。

通常,/proc/stat 中的 “cpu” 行会显示 CPU 的使用情况,例如:

cpu  0 0 0 0 0 0 0 0 0 0
cpu0 0 0 0 0 0 0 0 0 0
cpu1 0 0 0 0 0 0 0 0 0
...

执行上述 sed 命令后,会打印出除去 “cpu” 和空白字符后的行,例如:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
...

这些数字分别表示用户空间占用 CPU 时间的比例、系统空间占用 CPU 时间的比例、空闲 CPU 时间的比例等。