簡體   English   中英

使用sed從一行中提取時間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM