解析Bash内置时间的输出

时间:2014-11-06 16:47:20

标签: bash parsing awk command output

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

如果我要执行命令

time $ALGORITHM $VALUE $FILENAME

它产生输出:

real    0m0.435s
user    0m0.430s
sys     0m0.003s

取决于算法运行的值

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

非常感谢

3 个答案:

答案 0 :(得分:10)

你一定要小心:Bash内置time并且有外部命令time,通常位于/usr/bin/time(类型type -a time)以便拥有所有可用的time time stuff 1}}在你的系统上。)

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

time

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

要在标准输出上获得{ time stuff; } 2>&1 输出,您需要:

time

(分组和重定向)。

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

  

%

     

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

     

A literal `%`.

%[p][l]R
     

The elapsed time in seconds.

%[p][l]U
     

The number of CPU seconds spent in user mode.

%[p][l]S
     

The number of CPU seconds spent in system mode.

%P
     

The CPU percentage, computed as (%U + %S) / %R.

p
     

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

     

可选MMmSS.FFs指定格式p的更长格式,包括分钟。 $'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'的值确定是否包含该分数。

     

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

一样      

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

     

如果值为null,则不显示计时信息。显示格式字符串时会添加尾随换行符。

所以,要完全达到你想要的目的:

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

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

{{1}}

来源: BashFAQ032关于精彩的Greg's wiki

答案 1 :(得分:2)

您可以尝试使用以下awk命令,该命令使用拆分功能根据digit m或最后s拆分输入。

$ foo=$(awk '/^real/{split($2,a,"[0-9]m|s$"); print a[2]}' file)
$ echo "$foo"
0.435

答案 2 :(得分:2)

你可以使用这个awk:

var=$(awk '$1=="real"{gsub(/^[0-9]+[hms]|[hms]$/, "", $2); print $2}' file)
echo "$var"
0.435