时间命令的自定义格式

Joh*_*Doe 68 format bash shell time

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

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

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

{ time { # section code goes here } } 2> timing.log
Run Code Online (Sandbox Code Playgroud)

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

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

Arc*_*dix 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))""
Run Code Online (Sandbox Code Playgroud)

注意: $((...))可以用于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}"
Run Code Online (Sandbox Code Playgroud)

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

M="$((T%1000000000/1000000))"
Run Code Online (Sandbox Code Playgroud)

但这被删除了,因为它显然对一些人不起作用,而据报道新版本没有.我不同意这一点,因为我认为你必须只使用其余部分,但却被淘汰了.
选择适合你的一切.


Spa*_*ost 41

手册页的时间:

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

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

例:

$ /usr/bin/time -f'%E' ls /tmp/mako/
res.py  res.pyc
0:00.01
Run Code Online (Sandbox Code Playgroud)

  • 在OS X上,`time`没有-f标志.您可以通过使用[brew](http://brew.sh)(`brew install coreutils`)安装coreutils然后使用`/ usr/local/bin/gtime`来解决此问题. (4认同)
  • 这就是为什么命令:time -f'%E'无效,但/ usr/bin/time -f'%E'工作正常.谢谢 (3认同)

Pau*_*ce. 39

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

TIMEFORMAT='%3R'
Run Code Online (Sandbox Code Playgroud)

这将输出如下所示的实时:

5.009
Run Code Online (Sandbox Code Playgroud)

要么

65.233
Run Code Online (Sandbox Code Playgroud)

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

您可以使用:

TIMEFORMAT='%3lR'
Run Code Online (Sandbox Code Playgroud)

获得看起来像这样的输出:

3m10.022s
Run Code Online (Sandbox Code Playgroud)

l(ELL)给出了一个长格式.

  • @Kevin参见[`man bash`](https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-TIMEFORMAT)。 (4认同)

小智 29

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

例:

echo "Start $SECONDS"
sleep 10
echo "Middle $SECONDS"
sleep 10
echo "End $SECONDS"
Run Code Online (Sandbox Code Playgroud)

输出:

Start 0
Middle 10
End 20
Run Code Online (Sandbox Code Playgroud)