У меня есть следующая строка
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