Bash:提取字符串的一部分

Bash:提取字符串的一部分,bash,Bash,假设我有字符串“已使用内存:19.54M” 如何从中提取19.54? 19.54将频繁更改,因此我需要将其存储在变量中,并将其与下一次迭代时的值进行比较 我想我需要一些grep和regex的组合,但我从来没有真正理解regex。你可能想提取它,而不是删除它。您可以使用参数展开来提取值: var="Memory Used: 19.54M" var=${var#*: } # Remove everything up to a colon and space var=${var%

假设我有字符串“已使用内存:19.54M” 如何从中提取19.54? 19.54将频繁更改,因此我需要将其存储在变量中,并将其与下一次迭代时的值进行比较

我想我需要一些grep和regex的组合,但我从来没有真正理解regex。

你可能想提取它,而不是删除它。您可以使用参数展开来提取值:

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只能比较整数,它不支持浮点算术。

其他可能的解决方案:

> echo "Memory Used: 19.54M" | perl -pe 's/\d+\.\d+//g'
Memory Used: M
使用
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'`
使用
切割

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

您可以将bash regex支持与
=~
操作符一起使用,如下所示:

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

这将打印
19.54

“摘录”可以更好地解释我想做什么。那么,我如何更改第三行以删除“.”及其后面的所有内容呢?
${var%.*}
删除字符串末尾的一个点及其后面的任何内容。我可以问一下#和*在这里是什么意思吗?@one:如注释中所述,
表示“从左边删除”,而
*
只是一个匹配所有内容的通配符