Grep para um número excluindo sua parte de ponto flutuante

2

Eu tenho esta linha a seguir

scalar TestDmaMac4.sink.udpApp[0]   throughput:last     11730.559888477

Desejo extrair apenas 11730 dessa linha, como posso fazer isso com grep ? Eu quero ignorar o número após o ponto decimal e só preciso de dígitos antes do ponto decimal.

(Nota: há uma sequência {espaço} {tab} que separa cada um dos udpApp[0] , throughput:last e o número que começa com 11730 .)

    
por Linux-Fan85 13.04.2017 / 17:01

3 respostas

0

A expressão regular abaixo corresponderá a qualquer número flutuante no formato [0-9].[0-9] e retornará a parte inteira deste número flutuante.

$ 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]+.*)//' <<<"$a"  #using the lazy operator ?
11730
$ sed -r 's/(.*[^0-9.])([0-9]+)(\.[0-9]+.*)//' <<<"$a"  #sed does not have lazy operator thus we simulate this with negation
11730

Para fins de teste, eu também tentei acima do regexp em uma string diferente com o número flutuante na posição diferente sem um espaço à esquerda:

$ 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]+.*)//' <<<"$c"
11730
$ sed -r 's/(.*[^0-9.])([0-9]+)(\.[0-9]+.*)//' <<<"$c"
11730
    
por 14.04.2017 / 00:44
0
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'

resultado

11730
    
por 14.04.2017 / 04:43
-2

Usando o Grep:

grep -o " [0-9]\{1,\}"

Para testar:

echo "scalar TestDmaMac4.sink.udpApp[0] throughput:last 11730.559888477" | grep -o " [0-9]\{1,\}"

resultados:

11730
    
por 13.04.2017 / 20:57