私は次の行を持っています
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