自定义格式的时间命令
我想在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适合你的东西。
从时间的手册页 :
- 可能有一个内置的shell调用时间,通过指定
/usr/bin/time
来避免这种/usr/bin/time
-
您可以提供一个格式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