我有以下行
scalar TestDmaMac4.sink.udpApp[0] throughput:last 11730.559888477
我只想11730
從這一行中提取,我該怎麼做grep
?我想忽略小數點後面的數字,只需要小數點前的數字。
(註:有一個{空格}{製表符}分隔每個 的序列udpApp[0]
,throughput:last
以及以 開頭的數字11730
。
答案1
下面的正規表示式將符合格式中的任何浮點數[0-9].[0-9]
,並傳回該浮點數的整數部分。
$ a="scalar TestDmaMac4.sink.udpApp[0] throughput:last 11730.559888477"
$ egrep -o '[0-9]+[.][0-9]' <<<"$a" |egrep -o '[0-9]+[^.]' #First grep will isolate the floating number , second grep will isolate the int part.
11730
$ perl -pe 's/(.*?)([0-9]+)(\.[0-9]+.*)/\2/' <<<"$a" #using the lazy operator ?
11730
$ sed -r 's/(.*[^0-9.])([0-9]+)(\.[0-9]+.*)/\2/' <<<"$a" #sed does not have lazy operator thus we simulate this with negation
11730
為了進行測試,我還在不同的字串中嘗試了上面的正規表示式,其中浮點數位於不同的位置,沒有前導空格:
$ c="scalar throughput:last11730.559888477 TestDmaMac4.sink.udpApp[0]"
$ egrep -o '[0-9]+[.][0-9]' <<<"$c" |egrep -o '[0-9]+[^.]'
11730
$ perl -pe 's/(.*?)([0-9]+)(\.[0-9]+.*)/\2/' <<<"$c"
11730
$ sed -r 's/(.*[^0-9.])([0-9]+)(\.[0-9]+.*)/\2/' <<<"$c"
11730
答案2
l='scalar TestDmaMac4.sink.udpApp[0] throughput:last 11730.559888477'
read -r -a a <<<"$l"
dc -e "${a[-1]}dX10r^dsa*la/p"
echo "$l" | perl -lane 'print/\d+(?=\.\d+$)/g'
結果
11730
答案3
使用 Grep:
grep -o " [0-9]\{1,\}"
去測試:
echo "scalar TestDmaMac4.sink.udpApp[0] throughput:last 11730.559888477" | grep -o " [0-9]\{1,\}"
結果:
11730