繁体   English   中英

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

[英]Extract one number from string in bash

我有这个字符串:

1024.00 MB transferred (912.48 MB/sec)

我只需要获取数字912.48并使用bash脚本将其转换为912,48 我试图做sed 's/[^0-9.]*//g'但是这样我得到了1024.00 912.18 我该怎么做?

到目前为止,这里的每个答案都是使用外部工具( 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

这应该工作

$ sed -r 's/.*\(([0-9.]+).*/\1/;s/\./,/'
echo "1024.00 MB transferred (912.48 MB/sec)" | cut -f2 -d'(' | cut -f1 -d' ' | sed 's/\./,/'

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}'

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

另一个几乎无限的可能性:

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)"

这是完成工作的awk

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

912,48

哇,这么多答案:)

这是我的,应该很快:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM