1

所以我正在编写一个 bash 脚本,它必须根据命令“ps u”计算出总共使用了多少 CPU。我正在尝试像这样使用 awk:

TOTAL_CPU=$(ps u | awk '{sum = sum + $3}; END {print sum}')

命令“ps u”的典型输出有 11 列,第三列是 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”这样的值分配给一个预计只包含整数值的变量。我把这个放在这里,以防有人稍后通过谷歌找到这篇文章!

4

2 回答 2

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+意思是在每一后面加一个+符号。最后的手段使用标准输入。-
  • bc计算线条。由于所有数字都用+符号分隔,因此它将所有 CPU 数量加在一起。
于 2012-11-27T03:54:10.727 回答
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.

于 2012-11-27T00:47:49.057 回答