resultado

resultado

Tengo esta siguiente línea

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

Quiero extraer solo 11730de esta línea, ¿cómo puedo hacerlo grep? Quiero ignorar el número después del punto decimal y solo necesito dígitos antes del punto decimal.

(Nota: hay un{espacio}{pestaña}secuencia que separa cada uno de udpApp[0]y throughput:lastel número que comienza 11730.)

Respuesta1

La siguiente expresión regular coincidirá con cualquier número flotante en el formato [0-9].[0-9]y devolverá la parte entera de este número flotante.

$ 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

Para realizar las pruebas, también probé la expresión regular anterior en una cadena diferente con un número flotante en una posición diferente sin un espacio inicial:

$ 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

Respuesta2

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

Respuesta3

Usando Grep:

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

Probar:

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

resultados:

11730

información relacionada