我从Bash脚本运行C程序,并通过一个名为time的命令运行它,该命令输出算法运行的一些时间统计信息。
如果我要执行命令
time $ALGORITHM $VALUE $FILENAME
它产生输出:
real 0m0.435s
user 0m0.430s
sys 0m0.003s
取决于算法运行的值
但是,我希望能够采用0.435并将其分配给变量。 我已经读了一下awk,足以知道如果我把上面的命令输入awk,我应该能够抓住0.435并把它放在一个变量中。但是我该怎么做?
非常感谢
答案 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