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

スクリプトを使用して出力を解析する場合、実際の解決策はtoオプションを使用しないことです。-hdfそうすれば、出力には最初から「人間が読める」K/ M/Gサフィックスが含まれません。

代わりに-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];

ただし、-B1代わりにスイッチを使用する-hと、より正確で確実なことは言うまでもなく、同じ結果がより簡単に得られます。

于 2013-03-13T06:22:56.320 に答える