bash中的正则表达式没有给出预期的结果

时间:2016-08-08 07:52:59

标签: regex bash

我正在尝试使用正则表达式从df中提取一些信息。然而,我得到的信息并不是我所期待的。

我有以下代码:

#!/bin/bash

disk_info=$(df -hT /var/lib/mysql)
regex="([0-9]*[\.]?[0-9]*[GM]*) ([0-9]*[\.]?[0-9]*[GM]*) ([0-9]*[\.]?[0-9]*[GM]*) ([0-9]*)% \/var\/lib\/mysql$"

if [[ $disk_info =~ $regex ]]
then
    full_string="${BASH_REMATCH[0]}"
    size="${BASH_REMATCH[1]}"
    used="${BASH_REMATCH[2]}"
    avail="${BASH_REMATCH[3]}"
    usage="${BASH_REMATCH[4]}"

    echo "full string before regex is: $disk_info"
    echo "full string is: $full_string"
    echo "size of db is: $size"
    echo "used by db is: $used"
    echo "available on db is: $avail"
    echo "usage in percent on db is: $usage"
else
    echo "$disk_info doesn't match" >&2
fi

正则表达式用于提取4个匹配组。即为mysql分配的整个大小,使用的数量,可用的数量以及最后磁盘空间的使用百分比。现在大小,used和avail返回大小为千兆字节或兆字节,并且可以包含一个点,这就是我按照我的方式制作正则表达式的原因。

问题出在我运行时得到的输出。回报是:

full string before regex is: Filesystem           Type  Size  Used Avail     Use% Mounted on
/dev/mapper/vg00-lv_db
                 ext3   21G   11G  9.2G  54% /var/lib/mysql
full string after regex is:  9.2G  54% /var/lib/mysql
size of db is:
used by db is: 9.2G
available on db is:
usage in percent on db is: 54

正如你所看到的,正则表达式之后的字符串只返回了一半的数字。我认为它与前两个中缺少的点有关。另一个问题是,由于9.2G应该列出“db on available is:”而不是“db使用的是:”,因此命令似乎搞砸了。

提前致谢!

1 个答案:

答案 0 :(得分:1)

您的输入不仅包含单个空格作为分隔符。使用\ s +代替单个空格:

regex="([0-9]*[\.]?[0-9]*[GM]*)\s+([0-9]*[\.]?[0-9]*[GM]*)\s+([0-9]*[\.]?[0-9]*[GM]*)\s+([0-9]*)% \/var\/lib\/mysql$"