awk问题:总结非整数的问题?

时间:2012-11-27 00:43:17

标签: linux bash awk

所以我正在编写一个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”这样的值赋给一个预期只包含整数值的变量。我把它放在这里以防有人通过谷歌稍后发现这篇文章!

2 个答案:

答案 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