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 time为time你的系统上有所有可用的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此参数的值用作格式字符串,指定应如何显示以时间保留字为前缀的管道的时序信息.的
%字符引入了被扩展为时间值或其他信息的转义序列.逃逸序列及其含义如下; 括号表示可选部分.
%%Run Code Online (Sandbox Code Playgroud)A literal `%`.
%[p][l]RRun Code Online (Sandbox Code Playgroud)The elapsed time in seconds.
%[p][l]URun Code Online (Sandbox Code Playgroud)The number of CPU seconds spent in user mode.
%[p][l]SRun Code Online (Sandbox Code Playgroud)The number of CPU seconds spent in system mode.
%PRun Code Online (Sandbox Code Playgroud)The CPU percentage, computed as (%U + %S) / %R.可选项
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的精彩维基.