所以我正在编写一个bash脚本,必须根据命令“ps u”计算出总共使用了多少CPU。我正试图像这样使用awk:
TOTAL_CPU=$(ps u | awk '{sum = sum + $3}; END {print sum}')
命令“ps u”的典型输出有11列,第3列是CPU使用率。
问题是,这不应该像它应该的那样工作。当CPU值有小数时,我得到如下错误:
syntax error: invalid arithmetic operator (error token is ".x")
其中x是总和后的“剩余”小数。例如,如果值为“1.4”和“8.7”,则总和为“10.1”,因此错误将显示:
syntax error: invalid arithmetic operator (error token is ".1")
我怎样才能做我需要的事情?如果小数被截断,那就没关系,我不需要很多精度。
编辑:帖子编辑改变了我最初的写作
EDIT2:问题解决了!这根本不是awk的错;事实证明,这行代码隐藏在其他地方:
declare -i TOTAL_CPU
所以bash试图将一个像“3.4”这样的值赋给一个预期只包含整数值的变量。我把它放在这里以防有人通过谷歌稍后发现这篇文章!
答案 0 :(得分:2)
查看系统联机帮助页中的ps
命令。您可以重新格式化ps
输出以获得所需内容。例如,您可以打印出CPU数量并忘记输出的其余部分:
sum=$(ps -udavid -o %cpu | tail -n +2 | paste -sd+ - | bc)
ps -udavid
: david ps -udavid -o %cpu
:david拥有的进程。只显示CPU tail -n +2
:删除标题行(所有第2行到结尾)paste -sd+ -
-s
表示将所有行组合在一行中。 d+
表示在每个行后面加+
个符号。最终-
表示使用STDIN。bc
计算线条。由于所有数字都以+
符号分隔,因此它会将所有CPU数量加在一起。答案 1 :(得分:1)
从以下位置更改:
TOTAL_CPU=ps u | awk '{sum = sum + $3}; END {print sum}'
要:
TOTAL_CPU=$(ps u | awk '{sum = sum + $3}; END {print sum}')
这不是awk
问题,而是您的bash语法。
$(...)
表示法称为Command Substitution。基本上,它会从当前shell生成一个新的子shell,以执行它所包含的任何命令,然后将输出返回到新的子shell stdout
。