我正在尝试使用正则表达式从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使用的是:”,因此命令似乎搞砸了。
提前致谢!
答案 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$"