line开发者_运维知识库:
0.01user 0.00system 0:13.46elapsed 0%CPU (0avgtext+0avgdata 4272maxresident)k
I want to grab:
0:13.46
my current regex is:
sed 's/.*\([0-9]*:[0-9]*.[0-9]*\)elapsed.*/\1/'
I'm pretty sure the regex is correct, but it's not finding anything. It's probably something really simple, I'm just doing 10 things at once.
This works for me:
% 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
Note how I put a \s
before the first digit you want to match.
Then again, your regex kind of worked for me before in that it would print out :13.46
(the .*
gobbled up the first 0
that you want to print out).
Why not use awk?
awk '/elapsed/ {gsub(/elapsed/,""); print $3}'
I tried your sed expression on SL and got :13.46
I got :13.46
. This is caused by the initial .*
which expands as much as possible without compromising the following [0-9]*:
.
My suggestion: sed 's/.*system //;s/elapsed.*//'
If you have a version of time
that supports the format option, you don't need to parse its output:
$ /usr/bin/time -f %E sleep 2.27
0:02.27
In Bash, using its builtin time
:
$ TIMEFORMAT=%R
$ time sleep 2.27
2.337
Here's another solution:
echo $word | grep -oP '[^ ]*(?=elapsed)'
This looks for the largest character string before 'elapsed' which does not contain a space character.
This looks like a problem for which awk is better suited. You can solve this in awk without using regular expressions which are (relatively) inefficient.
awk '{ print substr($3, 1, length($3) - 7) }'
In a test I just ran, this awk solution is an order of magnitude faster than the accepted sed solution. I believe the significant performance improvement comes from avoiding regular expressions.
精彩评论