0

我必须检查磁盘卷上的可用空间并使用命令df -h,它会产生以下输出:

Filesystem            Size  Used Avail Use% Mounted on
/dev/md0               27G   24G  2.1G  92% /
udev                  506M  112K  506M   1% /dev
/dev/sda1             102M   40M   63M  39% /boot

这段脚本

my (@space, @freesp);
@space = grep /\/dev\/md0/,`df -h`;
print "@space\n";

在给我

/dev/md0               27G   24G  2.1G  92% /

我可以在空格上拆分,给出中的值$freesp[0]$freesp[1]等等。

但我想G用空格删除或替换它,以便我可以$freesp[3]与某个值进行比较并继续执行我的脚本。

那么我必须使用什么正则表达式来实现这一点,或者有没有其他更好的方法来做到这一点?

这段代码对我有用,但我正在寻找我提到的方向。

#!/usr/bin/perl

use strict;
use warnings;

my (@space, @freesp);

@space = grep /\/dev\/md0/, `df`;

print "@space\n";

for (@space) {
    chomp;
    @freesp = split /\s+/, $_;
}

if ($freesp[3]/1024/1024 < 2.0) {
    print "Space is less\n";
}
else {
    print "Space is OK\n";
}

#print ($freesp[3]/1024/1024);
4

1 回答 1

8

如果您打算使用脚本解析输出,真正的解决方案是不使用该-h选项。df这样一来,输出就不会首先包含“人类可读” K//后缀MG

您可能希望改用该-B1选项,这会导致所有大小都以字节为单位报告。


编辑:要回答字面问题,您可以删除后缀并适当地重新调整值,如下所示:

my %units = (K => 2**10, M => 2**20, G => 2**30, T => 2**40,
             P => 2**50, E => 2**60, Z => 2**70, Y => 2**80);

s/^(\d+(?:\.\d+)?)([KMGTPEZY])$/$1 * $units{$2}/e for @freesp[1 .. 3];

但是,使用-B1switch 而不是-h更容易得到相同的结果,更不用说更准确和可靠了。

于 2013-03-13T06:22:56.320 回答