自定义格式的时间命令

我想在bash脚本中使用time命令来计算脚本的运行时间并将其写入日志文件。 我只需要真正的时间 ,而不是用户和系统。 也需要一个体面的格式。 例如00:00:00:00(不像标准输出)。 我感谢任何build议。

预期的格式应该是00:00:00.0000 (毫秒)[小时]:[分钟]:[秒]。[毫秒]

我已经有3个脚本。 我看到了这样一个例子:

 { time { # section code goes here } } 2> timing.log 

但是我只需要真正的时间,而不是用户和系统。 也需要一个体面的格式。 例如00:00:00:00 (不像标准输出)。

换句话说,我想知道如何把时间输出变成更容易处理的东西。

您可以使用date命令来获取当前时间,执行定时工作之前和之后计算差异,如下所示:

 #!/bin/bash # Get time as a UNIX timestamp (seconds elapsed since Jan 1, 1970 0:00 UTC) T="$(date +%s)" # Do some work here sleep 2 T="$(($(date +%s)-T))" echo "Time in seconds: ${T}" printf "Pretty format: %02d:%02d:%02d:%02d\n" "$((T/86400))" "$((T/3600%24))" "$((T/60%60))" "$((T%60))"" 

注意: $((…))可用于bash中的基本运算 – 小心:不要在减号前放置空格因为这可能会被解释为命令行选项。

另见: http : //tldp.org/LDP/abs/html/arithexp.html

编辑:
另外,你可能想看看sed时间产生的输出中search并提取子串。

编辑:

以毫秒为单位的时间示例(实际上是纳秒,但在这里被截断为毫秒)。 你的date版本必须支持%N格式, bash应该支持大数字。

 # UNIX timestamp concatenated with nanoseconds T="$(date +%s%N)" # Do some work here sleep 2 # Time interval in nanoseconds T="$(($(date +%s%N)-T))" # Seconds S="$((T/1000000000))" # Milliseconds M="$((T/1000000))" echo "Time in nanoseconds: ${T}" printf "Pretty format: %02d:%02d:%02d:%02d.%03d\n" "$((S/86400))" "$((S/3600%24))" "$((S/60%60))" "$((S%60))" "${M}" 

免责声明:
我原来的版本说

 M="$((T%1000000000/1000000))" 

但这是编辑出来,因为它显然不为一些人工作,而新版本据报道。 我不赞成这个,因为我认为你只能使用剩下的部分,但是没有得到批准。
select适合你的东西。

从时间的手册页 :

  1. 可能有一个内置的shell调用时间,通过指定/usr/bin/time来避免这种/usr/bin/time
  2. 您可以提供一个格式string,其中一个格式选项是经过的时间 – 例如%E

    /usr/bin/time -f'%E' $CMD

例:

 $ /usr/bin/time -f'%E' ls /tmp/mako/ res.py res.pyc 0:00.01 

使用bash内置的variablesSECONDS 。 每次引用variables时,都会返回脚本调用以来的经过时间。

例:

 echo "Start $SECONDS" sleep 10 echo "Middle $SECONDS" sleep 10 echo "End $SECONDS" 

输出:

 Start 0 Middle 10 End 20 

要使用Bash内buildtime而不是/bin/time ,可以设置这个variables:

 TIMEFORMAT='%3R' 

这将输出实时,看起来像这样:

 5.009 

要么

 65.233 

数字指定精度,范围可以从0到3(默认值)。

您可以使用:

 TIMEFORMAT='%3lR' 

得到如下的输出:

 3m10.022s 

l (ell)给出一个长格式。

不太清楚你在问什么,你试过了吗:

 time yourscript | tail -n1 >log 

编辑:好吧,所以你知道如何获得时间,你只是想改变格式。 如果你描述了你想要的格式,这将有所帮助,但这里有一些事情要尝试:

 time -p script 

这将输出更改为每行一次(以秒为单位)并带小数。 你只需要真正的时间,而不是另外两个这样得到的秒数使用:

 time -p script | tail -n 3 | head -n 1