如何在bash中添加两个时间输出

时间:2011-12-28 23:01:19

标签: bash date time

我想用bash计算几个命令所花费的平均时间。 time命令的输出是min:sec.milisec。

我不知道如何在bash中添加这种输出,并在最后计算平均值。

我尝试将输出转换为日期,但输出为“date:invalid date`0:01.00'”。

2 个答案:

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