0.01user 0.00system 0:13.46elapsed 0%CPU (0avgtext+0avgdata 4272maxresident)k
我要抢:
0:13.46
我目前正则表达式是:
sed 's/.*\([0-9]*:[0-9]*.[0-9]*\)elapsed.*/\1/'
我敢肯定正则表达式是正确的,但它没有找到任何东西。这可能很简单,我一次只做10件事。
0.01user 0.00system 0:13.46elapsed 0%CPU (0avgtext+0avgdata 4272maxresident)k
我要抢:
0:13.46
我目前正则表达式是:
sed 's/.*\([0-9]*:[0-9]*.[0-9]*\)elapsed.*/\1/'
我敢肯定正则表达式是正确的,但它没有找到任何东西。这可能很简单,我一次只做10件事。
这个工作对我来说:我
% sed 's/.*\s\([0-9]*:[0-9]*.[0-9]*\)elapsed.*/\1/'
0.01user 0.00system 0:13.46elapsed 0%CPU (0avgtext+0avgdata 4272maxresident)k
0:13.46
注意如何把\s
要匹配的第一个数字之前。
然后,再次,您的正则表达式类型为我工作之前,它会打印出:13.46
(.*
吞下你想打印出来的第一个0
)。
为什么不使用awk?
awk '/elapsed/ {gsub(/elapsed/,""); print $3}'
我试过SL您的sed的表达,并得到:13.46
我得到了:13.46
。这是由于最初.*
,尽可能扩大而不影响以下[0-9]*:
。
我的建议:sed 's/.*system //;s/elapsed.*//'
如果你有一个版本的time
支持的格式选项,你并不需要解析它的输出:
$ /usr/bin/time -f %E sleep 2.27
0:02.27
在bash,利用其内置time
:
$ TIMEFORMAT=%R
$ time sleep 2.27
2.337
这里的另一种解决方案:
echo $word | grep -oP '[^ ]*(?=elapsed)'
这会查找'elapsed'之前的最大字符串,该字符串不包含空格字符。
这看起来像是一个awk更适合的问题。你可以在awk中解决这个问题,而不使用相对低效的正则表达式。
awk '{ print substr($3, 1, length($3) - 7) }'
在刚刚运行的测试中,这个awk解决方案比接受的sed解决方案快了一个数量级。我相信显着的性能改善来自避免正则表达式。
嗯,做了它,感谢您的快速反应 – Th3sandm4n 2011-02-17 20:20:53