解析Bash内置时间的输出

Str*_*ugh 5 bash awk parsing command output

我正在从Bash脚本运行一个C程序,并通过一个名为time的命令运行它,该命令输出一些运行算法的时间统计信息.

如果我要执行命令

time $ALGORITHM $VALUE $FILENAME
Run Code Online (Sandbox Code Playgroud)

它产生输出:

real    0m0.435s
user    0m0.430s
sys     0m0.003s
Run Code Online (Sandbox Code Playgroud)

值取决于算法的运行

但是,我希望能够采用0.435并将其分配给变量.我已经读了一下awk,足以知道如果我把上面的命令输入awk,我应该能够抓住0.435并将它放在一个变量中.但是我该怎么做?

非常感谢

gni*_*urf 14

你必须要小心:Bash内置time并且有外部命令time,通常位于/usr/bin/time(类型type -a timetime你的系统上有所有可用的s).

如果您的shell是Bash,那么当您发布时

time stuff
Run Code Online (Sandbox Code Playgroud)

你在打电话给内置的time.如果time没有一些小技巧,你不能直接捕获输出.这是因为time不想干扰你可能会执行的重定向或管道,这是一件好事.

要获得time标准输出,您需要:

{ time stuff; } 2>&1
Run Code Online (Sandbox Code Playgroud)

(分组和重定向).

现在,关于解析输出:解析命令的输出通常是一个坏主意,特别是当它可能没有时.幸运的是,Bash的time命令接受格式字符串.从手册:

TIMEFORMAT

此参数的值用作格式字符串,指定应如何显示以时间保留字为前缀的管道的时序信息.的%字符引入了被扩展为时间值或其他信息的转义序列.逃逸序列及其含义如下; 括号表示可选部分.

%%

   A literal `%`.
Run Code Online (Sandbox Code Playgroud)

%[p][l]R

   The elapsed time in seconds.
Run Code Online (Sandbox Code Playgroud)

%[p][l]U

   The number of CPU seconds spent in user mode.
Run Code Online (Sandbox Code Playgroud)

%[p][l]S

   The number of CPU seconds spent in system mode.
Run Code Online (Sandbox Code Playgroud)

%P

   The CPU percentage, computed as (%U + %S) / %R. 
Run Code Online (Sandbox Code Playgroud)

可选项p是指定精度的数字,小数点后的小数位数.值为0表示不输出小数点或小数.最多可以指定小数点后的三个位置; p大于3的值更改为3.如果p未指定,则使用值3.

optional l指定表单的较长格式,包括分钟MMmSS.FFs.值p确定是否包含分数.

如果未设置此变量,则Bash就像具有该值一样

$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'

如果该值为null,则不显示任何计时信息.显示格式字符串时,将添加尾随换行符.

所以,要完全实现你想要的:

var=$(TIMEFORMAT='%R'; { time $ALGORITHM $VALUE $FILENAME; } 2>&1)
Run Code Online (Sandbox Code Playgroud)

正如@glennjackman指出的那样,如果你的命令将任何消息发送到标准输出和标准错误,你也必须照顾它.为此,需要一些额外的管道:

exec 3>&1 4>&2
var=$(TIMEFORMAT='%R'; { time $ALGORITHM $VALUE $FILENAME 1>&3 2>&4; } 2>&1)
exec 3>&- 4>&-
Run Code Online (Sandbox Code Playgroud)

资料来源: BashFAQ032关于Greg的精彩维基.

  • +1非常好.你是如何学习分组技巧的? (2认同)