나는 다음 줄을 가지고 있습니다
scalar TestDmaMac4.sink.udpApp[0] throughput:last 11730.559888477
이 행에서만 추출하고 싶은데 11730
어떻게 해야 합니까 grep
? 소수점 이하의 숫자는 무시하고 소수점 이하의 숫자만 필요로 하고 싶습니다.
(참고:{space}{tab}각각을 구분하는 시퀀스 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 -o " [0-9]\{1,\}"
테스트하려면:
echo "scalar TestDmaMac4.sink.udpApp[0] throughput:last 11730.559888477" | grep -o " [0-9]\{1,\}"
결과:
11730