使用Unix“time”命令将时间输出到文件,但将命令的输出保留到控制台

oprakyz7  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(193)

我对一个有输出的命令计时。我想把time命令的真实的时间输出到一个文件中,但是把命令的输出留给控制台。
例如,如果我执行time my_command,我会在控制台中打印以下内容:

several lines of output from my_command ...
real 1m25.970s
user 0m0.427s
sys 0m0.518s

在本例中,我只想将1m25.970s存储到一个文件中,但仍然要将命令的输出打印到控制台。

envsm3lx

envsm3lx1#

time命令比较复杂。time的POSIX规范没有定义默认的输出格式,但是为-p(可能是'POSIX')选项定义了一种格式。请注意管道中对命令序列的讨论(不容易理解)。
Bash规范说time在'pipeline'前面加了前缀,这意味着time cmd1 | cmd2乘以cmd1cmd2,它将结果写入标准误差。Korn shell也是类似的。
POSIX格式要求在标记(如real)和时间之间有一个空格;默认格式通常使用制表符而不是空格。注意/usr/bin/time命令可能还有另一种输出格式。例如,在macOS上,它在一行中列出3个时间,默认情况下,标签在时间值之后;它支持-p以近似于POSIX格式的格式打印(但在标签和时间之间有多个空格)。
您可以轻松地将写入标准错误的所有信息写入一个文件:

(time my_command) 2> log.file

如果my_command或它调用的任何程序向标准错误报告任何错误,这些错误也会被记录到日志文件中,并且time输出的所有三行都会被写入到文件中。
如果您的shell是Bash,则可以使用进程替换来过滤一些输出。
我不会用一个命令行来尝试;使其工作所需的象形文字是可怕的,最好封装在shell脚本中。
例如,shell脚本time.filter捕获time的输出,并仅将real时间写入日志文件(默认值为log.file,可通过提供替代日志文件名作为第一个参数进行配置


# !/bin/sh

output="${1:-log.file}"
shift
sed -E '/^real[[:space:]]+(([0-9]+m)?[0-9]+[.][0-9]+s?)/{ s//\1/; w '"$output"'
        d;}
        /^(user|sys)[[:space:]]+(([0-9]+m)?[0-9]+[.][0-9]+s?)/d' "$@"

这里假设您的sed使用-E来启用扩展正则表达式。它接受可选的分钟值,如60m05.003s,或者只接受秒值5.00s,或者5.0(POSIX格式-小数点后至少需要一位数字)。它捕获时间部分并将其打印到所选文件(默认为log.file;您可以在命令行中指定一个替代名称作为第一个参数)。注意,即使是GNU sed也会将w命令后面的所有内容都视为文件名;你必须在新行上继续d(删除)命令和右大括号}。GNU sed不要求在d后面有分号; BSD(macOS)sed可以。第二行识别并删除在usersys时间中报告的行。其他所有内容都原样通过。
该脚本处理您在日志文件名之后给予的任何文件,如果您没有提供任何文件,则处理标准输入。更好的命令行表示法是使用显式选项(-l logfile)和getopts来指定日志文件。
有了这些,我们就可以设计一个报告标准错误和标准输出的程序-my_command

echo "nonsense: error: positive numbers are required for argument 1" >&2
dribbler -s 0.4 -r 0.1 -i data -t
echo "apoplexy: unforeseen problems induced temporary amnesia" >&2

你可以使用cat data来代替dribbler命令。dribbler命令从data中读取行,将它们写入标准输出,行与行之间具有高斯分布的随机延迟。平均延迟为0.4秒;标准偏差是0.1秒。2另外两行是假装向标准误差报告错误的命令。
我的data文件包含了一首无意义的“诗”,名为'The Great Panjandrum'
有了这个背景,我们可以运行命令并捕获log.file中的真实的时间,删除(忽略)用户和系统时间值,同时使用以下命令将其余的标准误差发送到标准误差:

$ (time my_command) 2> >(tee raw.stderr | time.filter >&2)

nonsense: error: positive numbers are required for argument 1
So she went into the garden
to cut a cabbage-leaf
to make an apple-pie
and at the same time
a great she-bear coming down the street
pops its head into the shop
What no soap
So he died
and she very imprudently married the Barber
and there were present
the Picninnies
and the Joblillies
and the Garyulies
and the great Panjandrum himself
with the little round button at top
and they all fell to playing the game of catch-as-catch-can
till the gunpowder ran out at the heels of their boots
apoplexy: unforeseen problems induced temporary amnesia

$ cat log.file

0m7.278s

(The所需时间通常在6到8秒之间。有17行,所以如果每行0.4秒,您预计大约需要6.8秒。)空白行来自time;删除空行是非常困难的,而且只能删除空行,特别是POSIX规定它是可选的,不值得这样做。

相关问题