时间命令的自定义格式

时间:2010-09-10 09:14:50

标签: bash shell time format

我想在 bash脚本中使用 time 命令来计算脚本的已用时间并将其写入日志文件。我只需要实时,而不是用户和sys。还需要一个体面的格式。例如00:00:00:00(不像标准输出)。我很感激任何建议。

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

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

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

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

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

6 个答案:

答案 0 :(得分:87)

您可以使用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来搜索并从时间生成的输出中提取子字符串。

编辑:

以毫秒为单位的时序示例(实际为纳秒,但此处截断为毫秒)。您的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))"

但是这个被删除了,因为它显然对一些人不起作用,而据报道新版本没有。我不同意这一点,因为我认为你必须只使用其余部分,但却被投票了 选择适合你的任何东西。

答案 1 :(得分:40)

来自man page for time

  1. 可能有一个内置的shell称为时间,通过指定/usr/bin/time
  2. 来避免这种情况
  3. 您可以提供格式字符串,其中一种格式选项是已用时间 - 例如%E

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

  4. 示例:

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

答案 2 :(得分:38)

要使用Bash内置time而不是/bin/time,您可以设置此变量:

TIMEFORMAT='%3R'

将输出如下所示的实时:

5.009

65.233

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

您可以使用:

TIMEFORMAT='%3lR'

获得看起来像的输出:

3m10.022s

l(ell)给出了长格式。

答案 3 :(得分:29)

使用bash内置变量SECONDS。每次引用变量时,它都将返回自脚本调用以来经过的时间。

示例:

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

输出:

Start 0
Middle 10
End 20

答案 4 :(得分:2)

不太确定你在问什么,你试过了吗?

time yourscript | tail -n1 >log

编辑:好的,所以你知道如何排除时间,你只想改变格式。如果你描述了你想要的格式会有所帮助,但是有些事情要尝试:

time -p script

这会将输出更改为每行一次,以秒为单位。你只想要实时而不是其他两个来获得使用的秒数:

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

答案 5 :(得分:0)

接受的答案给了我这个输出

# bash date.sh
Time in seconds: 51
date.sh: line 12: unexpected EOF while looking for matching `"'
date.sh: line 21: syntax error: unexpected end of file

这就是我解决问题的方式

#!/bin/bash

date1=$(date --date 'now' +%s) #date since epoch in seconds at the start of script
somecommand
date2=$(date --date 'now' +%s) #date since epoch in seconds at the end of script
difference=$(echo "$((date2-$date1))") # difference between two values
date3=$(echo "scale=2 ; $difference/3600" | bc) # difference/3600 = seconds in hours
echo SCRIPT TOOK $date3 HRS TO COMPLETE # 3rd variable for a pretty output.