平均来自sed的管道号码

时间:2015-09-01 14:11:16

标签: bash awk sed

我正在开发一个命令,它从顶部获取最新的cpu百分比,然后平均来自所有cpu的负载,以产生cpu负载的总百分比。我目前拥有的命令是......

top -bn2 | awk '/Cpu/ {print $4}' | sed 's/[\[|]//g;'

这里有一个示例输出......

11
12
5
5

无论出于何种原因,前两个数字始终保持不变。所以在这一点上,我需要做的是平均此列表中的最后两个数字并附加一个百分号。这样做的理想方式是什么?如果可能的话,我更喜欢使用awk,但我并不精通awk所以我可以使用一些帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

如果您的目标只是将最后两个数字平均为四个,那么下面的awk就足够了:

awk 'NR<=2 {print;next} {n+=$1} END {printf("%.2f%%\n", n/(NR-2))}'

您可以调整输出格式以满足您的需求。

如果您不想打印前两行,可以将其简化为:

awk 'NR>2 {n+=$1} END {printf("%.2f%%\n", n/(NR-2))}'

从技术上讲,这只是跳过前两行,对剩余的行(或者更确切地说,这些行上的第一个单词)求和,然后一旦没有更多的行要处理,打印除以2的总和小于线条处理。因此,如果您愿意,它将适用于超过2行。

同样,%.2f格式为您提供了一个带有两个小数位的浮点数。如果要调整它,可以根据awk或printf手册页中的文档进行调整。

<强>更新

awk脚本的细分。

首先要了解的是awk是如何工作的。 awk脚本由一系列condition {statement}对组成。对于输入的每个“记录”(通常是一行文本),awk逐个逐步执行每个条件,如果它们评估为true,则awk执行相关的语句。

在这种情况下,我们有一个条件NR>2,如果当前记录号大于2,则计算结果为true。换句话说,在第二行输入通过之前不会执行任何语句。在此之后,运行语句{n+=$1},这将向变量n添加当前行的第一个“单词”(默认为空格分隔)的值。

在所有输入线都用尽之后,匹配魔术条件END。完成所有输入后,将运行本节中的语句。语句{printf("%.2f%%\n", n/(NR-2))}打印我们之前在脚本中添加的变量,除以记录数(行数)减去2.这是跳过前两行的所有行的平均值。

清除?