我想用bash计算几个命令所花费的平均时间。 time命令的输出是min:sec.milisec。
我不知道如何在bash中添加这种输出,并在最后计算平均值。
我尝试将输出转换为日期,但输出为“date:invalid date`0:01.00'”。
答案 0 :(得分:6)
这是一个三部分答案
首先,使用TIMEFORMAT
变量仅输出经过的秒数。然后你可以直接添加
来自man bash
<强> TIMEFORMAT 强> 该参数的值用作指定时序信息的格式字符串 对于以时间保留字为前缀的管道应显示。人物 引入了一个转义为时间值或其他信息的转义序列。该 逃逸序列及其含义如下;大括号表示可选部分。
这是一个仅输出精度为0的秒的例子,即没有小数点。阅读第三部分为何重要。
TIMEFORMAT='%0R'; time sleep 1
1
其次,我们如何捕获time
的输出?这实际上有点棘手,以下是从上面的命令中捕获时间的方法
TIMEFORMAT='%0R'; time1=$( { time sleep 1; } 2>&1 )
我们如何将时间加在一起并获得平均值?
在bash中,我们使用$(( ))
构造来进行数学运算。请注意bash
本身不支持浮点,因此您将进行整数除法(因此精度为0.)这是一个脚本,它将从两个命令中捕获time
并输出每个单独的时间和他们的平均值
#!/bin/bash
TIMEFORMAT='%0R'
time1=$( { time sleep 1; } 2>&1 )
time2=$( { time sleep 4; } 2>&1 )
ave=$(( (time1 + time2) / 2))
echo "time1 is $time1 | time2 is $time2 | average is $ave"
time1 is 1 | time2 is 4 | average is 2
如果整数除法对你来说并非你想要的精确度,只要你不介意调用外部二进制文件bc
,你就可以很容易地做到这一点。
#!/bin/bash
TIMEFORMAT='%3R'
time1=$( { time sleep 1; } 2>&1 )
time2=$( { time sleep 4; } 2>&1 )
ave=$( bc <<<"scale=3; ($time1 + $time2)/2" )
echo "time1 is $time1 | time2 is $time2 | average is $ave"
time1 is 1.003 | time2 is 4.003 | average is 2.503
答案 1 :(得分:1)
对于示例,我将使用变量preinitialized:
time="54:32.96";
minutes=$(echo "$time" | cut -d":" -f1)
seconds=$(echo "$time" | cut -d":" -f2 | cut -d"." -f1)
millis=$(echo "$time" | cut -d":" -f2 | cut -d"." -f2)
#Total time in millis
totalMillisOne=$(($millis+$seconds*1000+$minutes*60000))
你用每个命令执行此操作,然后将其保存在不同的变量中,然后执行平均值:
let avMillis=$totalMillisOne+$totalMillisTwo
let avMillis=$avMillis/2
然后以相同的输入格式输出:
let avSeconds=$avMillis/1000
let avMillis=$avMillis-$avSeconds*1000;
let avMinutes=$avSeconds/60;
let avSeconds=$avSeconds-$avMinutes*60;
echo "${avMinutes}:${avSeconds}.${avMillis}"