以下是我想要的分步解释
- 该脚本运行了 10 次
- 输入命令后,
su -c hackbench -pTl 4000
它会导出一条消息,例如,Running in threaded mode with 10 groups using 40 file descriptors each (== 400 tasks) Each sender will pass 4000 messages of 100 bytes Time: 13.353
用不同的时间代替 13.353 - 我想将添加
13.353
到下一个值,su -c hackbench -pTl 4000
例如,Running in threaded mode with 10 groups using 40 file descriptors each (== 400 tasks) Each sender will pass 4000 messages of 100 bytes Time: 10.476
为了找到 10 次运行的平均值
我知道它可以用 for 循环来循环,我甚至知道可以像下面这样添加时间
TIME=$(($TIME + $("somehow we have to bring '10.476' here")))
我只是不知道如何才能获得 13.353 和 10.476
答案1
使用 awk:
$ su -c hackbench -pTl 4000| awk '{print $NF}'
13.353
awk 将每个输入行拆分为字段. $NF
是该行的最后一个字段。
使用 grep:
$ su -c hackbench -pTl 4000| grep -oE '[[:digit:]+-.]+$'
13.353
-o
告诉grep
仅打印匹配的内容。 [:digit:]+-.]+$
匹配行尾的数字。
使用 sed:
$ su -c hackbench -pTl 4000| sed 's/.* //'
13.353
s/.* //
删除该行中直到最后一个空格为止的所有内容。仅保留最后一个数字。
使用 bash:
$ readarray -d' ' arr < <(su -c hackbench -pTl 4000); echo "${arr[-1]}"
13.353
这将 hackbench 命令的输出读入数组arr
。 ${arr[-1]}
打印数组的最后一个元素。(这需要较新版本的 bash。)
添加
Bash 不理解浮点数。因此,必须使用 awk 或 bc 或其他工具。例如:
$ time=10
$ time=$(echo "$time + ${arr[-1]}" | bc -l)
$ echo "$time"
23.353
另外,在工作中,最好使用小写或大小写混合的 shell 变量名。这是因为系统使用大写变量名,而您不想意外覆盖其中一个变量名。