使用sed从一行中提取时间

时间:2011-02-17 19:36:06

标签: regex sed

行:

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件事。

6 个答案:

答案 0 :(得分:0)

为什么不使用awk?

awk '/elapsed/ {gsub(/elapsed/,""); print $3}'

我在SL上尝试了你的sed表达式,得到了:13.46

答案 1 :(得分:0)

这对我有用:

% 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。< / p>

答案 2 :(得分:0)

我得到了:13.46。这是由初始.*引起的,该[0-9]*:尽可能扩展而不会影响以下sed 's/.*system //;s/elapsed.*//'

我的建议:{{1}}

答案 3 :(得分:0)

如果您的time版本支持format选项,则无需解析其输出:

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

在Bash中,使用其内置time

$ TIMEFORMAT=%R
$ time sleep 2.27
2.337

答案 4 :(得分:0)

这是另一种解决方案:

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

这将查找“elapsed”之前的最大字符串,该字符串不包含空格字符。

答案 5 :(得分:0)

这看起来像awk更适合的问题。您可以在awk中解决此问题,而无需使用(相对)低效的正则表达式。

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

在刚刚运行的测试中,这个awk解决方案比接受的sed解决方案快了一个数量级。我相信显着的性能提升来自于避免使用正则表达式。