Tengo esta siguiente línea
scalar TestDmaMac4.sink.udpApp[0] throughput:last 11730.559888477
Quiero extraer solo 11730
de 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:last
el 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