Regex 使用sed从一行中提取时间

Regex 使用sed从一行中提取时间,regex,sed,Regex,Sed,行: 我想抓住: 0.01user 0.00system 0:13.46elapsed 0%CPU (0avgtext+0avgdata 4272maxresident)k 我现在的正则表达式是: 0:13.46 我很确定正则表达式是正确的,但它什么也找不到。它可能非常简单,我一次只做10件事。为什么不使用awk sed 's/.*\([0-9]*:[0-9]*.[0-9]*\)elapsed.*/\1/' 我在SL上尝试了您的sed表达式,得到了:13.46这对我很有用: awk '/e

行:

我想抓住:

0.01user 0.00system 0:13.46elapsed 0%CPU (0avgtext+0avgdata 4272maxresident)k
我现在的正则表达式是:

0:13.46
我很确定正则表达式是正确的,但它什么也找不到。它可能非常简单,我一次只做10件事。

为什么不使用awk

sed 's/.*\([0-9]*:[0-9]*.[0-9]*\)elapsed.*/\1/'
我在SL上尝试了您的sed表达式,得到了
:13.46

这对我很有用:

awk '/elapsed/ {gsub(/elapsed/,""); print $3}'
请注意,我是如何在要匹配的第一个数字之前放置一个
\s


再说一次,你的正则表达式以前对我很有用,因为它可以打印出
:13.46
(你想打印的第一个
0
*
吞掉了)。

我得到了
:13.46
。这是由初始的
*
引起的,它在不影响以下
[0-9]*:
的情况下尽可能地扩展


我的建议:
sed的/*system/;s/eassed.*/'
如果您有一个支持格式选项的
time
版本,则无需解析其输出:

% 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
在Bash中,使用其内置的
时间

$ /usr/bin/time -f %E sleep 2.27
0:02.27

下面是另一个解决方案:

echo$word | grep-oP'[^]*(?=appead)


这将查找“经过”之前不包含空格字符的最大字符串

这似乎是awk更适合解决的问题。您可以在awk中解决这个问题,而无需使用效率(相对)较低的正则表达式

$ TIMEFORMAT=%R
$ time sleep 2.27
2.337
在我刚刚运行的一个测试中,这个awk解决方案比公认的sed解决方案快一个数量级。我相信显著的性能改进来自于避免使用正则表达式

awk '{ print substr($3, 1, length($3) - 7) }'