在bash中从字符串中提取一个数字

时间:2016-12-19 19:51:17

标签: bash shell sh

我有这个字符串:

1024.00 MB transferred (912.48 MB/sec)

我需要只使用数字912.48并使用bash脚本在912,48中对其进行转换。 我尝试sed 's/[^0-9.]*//g',但这样我得1024.00 912.18。 我该怎么办?

8 个答案:

答案 0 :(得分:2)

到目前为止,此处的每个答案都使用外部工具(sedawkgreptr等),而不是坚持本机bash功能。由于旋转外部过程具有显着的恒定时间性能影响,因此当仅处理单行内容时(对于长内容流,外部工具通常会更有效),它通常是不合需要的。

这只使用内置插件:

# one-time setup: set the regex
re='[(]([0-9.]+) MB/sec[)]'
string='1024.00 MB transferred (912.48 MB/sec)'

if [[ $string =~ $re ]]; then  # run enclosed code only if regex matches
  val=${BASH_REMATCH[1]}       # refer to first (and only) match group
  val_with_comma=${val//./,}   # replace "." with "," in that group
  echo "${val_with_comma}"     # ...and emit our output
fi

...得到以下特性:

912,48

答案 1 :(得分:1)

这应该有效

$ sed -r 's/.*\(([0-9.]+).*/\1/;s/\./,/'

答案 2 :(得分:1)

echo "1024.00 MB transferred (912.48 MB/sec)" | cut -f2 -d'(' | cut -f1 -d' ' | sed 's/\./,/'

答案 3 :(得分:1)

awksed的组合:

str='1024.00 MB transferred (912.48 MB/sec)'
echo "$str" | awk '{print $4}' | sed 's/(//;s/\./,/'

912,48

或完全使用awk

echo "$str" | awk '{sub("[(]","");sub("[.]",",");print $4}'

答案 4 :(得分:0)

echo "1024.00 MB transferred (912.48 MB/sec)" | cut -d " " -f4 | tr "." "," | tr -d "("

答案 5 :(得分:0)

另一种近乎无限的可能性:

read x y < <(tr -dc '[0-9. ]' <<< "1024.00 MB transferred (912.48 MB/sec)")
echo ${y}

grep -oP '(?<=\()[\d.]+' <<< "1024.00 MB transferred (912.48 MB/sec)"

答案 6 :(得分:0)

这是完成工作的awk

s='1024.00 MB transferred (912.48 MB/sec)'
awk -F '[() ]+' '{sub(/\./, ",", $4); print $4}' <<< "$s"

912,48

答案 7 :(得分:0)

哇,这么多答案:)

这是我的,应该很快:

grep -o '([^ ]\+' | tail -c+2 | tr '.' ','