【发布时间】:2013-12-26 03:01:57
【问题描述】:
我有一个从 /proc/stat 读取并计算 CPU 使用率的脚本。 /proc/stat中有3行相关的:
cpu 1312092 24 395204 12582958 77712 456 3890 0 0 0
cpu0 617029 12 204802 8341965 62291 443 2718 0 0 0
cpu1 695063 12 190402 4240992 15420 12 1172 0 0 0
目前,我的脚本只读取第一行并从中计算使用情况:
cpu=($( cat /proc/stat | grep '^cpu[^0-9] ' ))
unset cpu[0]
idle=${cpu[4]}
total=0
for value in "${cpu[@]}"; do
let total=$(( total+value ))
done
let usage=$(( (1000*(total-idle)/total+5)/10 ))
echo "$usage%"
这按预期工作,因为脚本只解析这一行:
cpu 1312092 24 395204 12582958 77712 456 3890 0 0 0
只获取以cpu0 和cpu1 开头的行很容易
cpu=$( cat /proc/stat | grep '^cpu[0-9] ' )
但我不知道如何遍历每一行并应用相同的过程。我试过在子shell中重置内部字段分隔符,如下所示:
cpus=$( cat /proc/stat | grep '^cpu[0-9] ' )
(
IFS=$'\n'
for cpu in $cpus; do
cpu=($cpu)
unset cpu[0]
idle=${cpu[4]}
total=0
for value in "${cpu[@]}"; do
let total=$(( total+value ))
done
let usage=$(( (1000*(total-idle)/total+5)/10 ))
echo -n "$usage%"
done
)
但这会给我一个语法错误
line 18: (1000*(total-idle)/total+5)/10 : division by 0 (error token is "+5)/10 ")
如果我在循环中回显cpu 变量,它看起来像是正确地分隔了行。我查看了this thread,我认为我将 cpu 变量正确分配给了一个数组,但是我没有看到另一个错误吗?
我把我的脚本放到whats wrong with my script 中,除了关于在$() 中使用cat 的警告之外,它没有显示任何错误,所以我很难过。
【问题讨论】:
-
我认为你应该在
awk中尝试这样做。 -
@Staven 我会调查的。像这样的东西在 awk 中几乎是单行吗?
-
@user30588 我在回答中也添加了
awk解决方案 -
@janos 感谢您的提醒。您的 bash 答案很有帮助,尽管另一个答案中的
awk脚本优于您答案中的单行awk脚本。 -
@user30588 不客气。我不知道你说的“优越”是什么意思,他的解决方案是等价的,只是语法不同。
标签: bash