结果

结果

我有以下行

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

相关内容