[英]using sed to extract a time from a line
線:
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件事。
為什么不使用awk?
awk '/elapsed/ {gsub(/elapsed/,""); print $3}'
我在SL上嘗試了您的sed表達式,得到了:13.46
這對我有用:
% 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
,因為它會打印出:13.46
( .*
吞噬了您要打印的第一個0
)。
我得到了:13.46
。 這是由初始.*
引起的,該擴展名在不影響以下[0-9]*:
情況下盡可能擴展。
我的建議: sed 's/.*system //;s/elapsed.*//'
如果您的time
版本支持format選項,則無需解析其輸出:
$ /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)'
這會在“經過”之前尋找不包含空格字符的最大字符串。
這似乎是awk更適合的問題。 您可以在awk中解決此問題,而無需使用效率相對較低的正則表達式。
awk '{ print substr($3, 1, length($3) - 7) }'
在我剛進行的測試中,這個awk解決方案比公認的sed解決方案快一個數量級。 我認為,顯着的性能改進來自避免使用正則表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.