Bash:提取字符串的一部分

45

假设我有一个字符串 "Memory Used: 19.54M",如何从中提取出 19.54? 由于 19.54 经常变化,因此需要将其存储在一个变量中,并与下一次迭代的值进行比较。

我想我需要一些 grep 和正则表达式的组合,但我从来没有真正理解过正则表达式..


可能是重复的问题:如何从Bash变量中删除空格? - user2284570
4个回答

88
你可能想要“提取”它,而不是“删除”它。你可以使用参数扩展来提取值:

您可能希望提取它而不是删除它。您可以使用参数扩展来提取该值:

var="Memory Used: 19.54M"
var=${var#*: }            # Remove everything up to a colon and space
var=${var%M}              # Remove the M at the end

注意,Bash 只能比较整数,它不支持浮点数算术运算。


提取更好地解释了我想做的事情。那么,我该如何更改第三行以删除“.”和其后面的所有内容? - confusified
10
${var%.*} 去除字符串末尾的点和其后面的任何字符。 - choroba
请问这里的#和*分别代表什么意思? - once
3
如评论所述,#表示“从左边移除”,而*只是一个通配符,可以匹配任何内容。 - choroba
可以使用${var//[A-Z,a-z,:]} 达到相同的效果。 - Vadim KOT

51

其他可能的解决方案:

使用grep

var="Memory Used: 19.54M"
var=`echo "$var" | grep -o "[0-9.]\+"`

使用 sed 命令:

var="Memory Used: 19.54M"
var=`echo "$var" | sed 's/.*\ \([0-9\.]\+\).*/\1/g'`

使用cut命令:

var="Memory Used: 19.54M"
var=`echo "$var" | cut -d ' ' -f 3 | cut -d 'M' -f 1`

使用awk

var="Memory Used: 19.54M"
var=`echo "$var" | awk -F'[M ]' '{print $4}'`

4

你可以使用 =~ 操作符来支持Bash正则表达式,如下所示:

var="Memory Used: 19.54M"
if [[ $var =~ Memory\ Used:\ (.+)M ]]; then
    echo ${BASH_REMATCH[1]}
fi

这将打印出19.54

最佳的BASH解析器! - ir0h

1
> echo "Memory Used: 19.54M" | perl -pe 's/\d+\.\d+//g'
Memory Used: M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接