拆分数字和百分号进行比较

时间:2016-05-19 15:56:27

标签: perl

我编写了一个小的perl脚本来检测,如果分区因填充而出现问题。

我用bash shell调用我的脚本,如下所示:

chk_part.sh /PARTITION

效果很好,但是从8或9开始的计数器出现问题。 例如如果我的分区已经填满了8%,我会得到"关键"

我认为问题在于我使用字符(%)和数字(8)混合进行比较(ltgt,{{1} })。

我该如何解决?

eq

5 个答案:

答案 0 :(得分:3)

您需要删除%标志。一个好方法是使用正则表达式匹配和捕获组。同时,这有助于从df找到格式错误的输出。

my $res = `df -h $LZE |awk 'FNR == 2 {print \$5}'`;
$res =~ m/(\d+)%/;
my $used_space = $1 or die "Something went wrong with df: $!";

given ($used_space) {
    when ($used_space < 75) { ... }
}

my $used_space = $1 or die "Something went wrong with df: $!";行将匹配值($1是第一个捕获组)分配给$user_space。该操作返回相同的值。如果它不是真值(即undef),则低约束or将触发其右侧命令,程序将死亡。

有关详细信息,请参阅perlre

答案 1 :(得分:2)

请注意given/when是实验性的,您可能需要重新考虑使用它。不管怎样,我做了一些细微的修改,让你的代码做你想做的事。

它从正则表达式搜索/替换中删除% $used_space,从实际的comaprisons中删除%符号,并将其添加到打印结果中。

my $used_space = `df -h $LZE |awk 'FNR == 2 {print \$5}'`;

$used_space =~ s/%//;

given ($used_space) {
    chomp($used_space);
    when ($used_space < 75) { print "OK - $used_space% of disk space used by $LZE\n"; exit(0); }
    when ($used_space == 75) { print "WARNING - $used_space% of disk space used by $LZE\n"; exit(1);  }
    when ($used_space > 75) { print "CRITICAL - $used_space% of disk space used by $LZE\n"; exit(2); }
    default { print "UNKNOWN - $used_space% of disk space used by $LZE\n"; exit(3); }
}

答案 2 :(得分:2)

或者没有不必要的3个外部二进制文件(bash + df + awk)并解析其输出 - 使用Filesys::Df或{{3}例如:

#!/usr/bin/env perl
use 5.014;
use warnings;
use Filesys::Df;
my $limit = 75;
my @txt = qw(OK WARNING CRITICAL);

for my $fs (@ARGV) {
    my $ref = df($fs);
    unless($ref) { warn "Unknown filesystem $fs"; next }
    my $lev = $ref->{per} < $limit ? 0 : $ref->{per} == $limit ? 1 : 2;
    say "$txt[$lev] - $ref->{per}% of disk space used by $fs";
}

将其用作./mydf / /foobar /tmp打印

OK - 66% of disk space used by /
Unknown filesystem /foobar at ./mydf line 10.
OK - 10% of disk space used by /tmp

答案 3 :(得分:1)

这里的问题是eq之类的东西并没有做你所假设的。他们进行字符串值比较,所以进行字母数字比较。

请参阅:perlop

你正在逃避它,因为按字母顺序比较“两位数”&#39;百分比可以获得正确的结果。

但如果您按字母顺序排序:ab出现在cdefg之前。

所以基本上 - 不要使用那些运营商。从您的数字中创建一个数值(s/%//g将执行此操作),然后与==<>进行比较。

#!/usr/bin/env perl
use strict;
use warnings;

my @values = ( '7%', '8%', '9%', '10%', '11%', '75%', '80%', '100%' );

print join "\n", sort { $a cmp $b } @values;

这将为您提供以下订单:

10%
100%
11%
7%
75%
8%
80%
9%

我很确定这几乎就是你 想要的。 (因为&#39; 100%已满&#39;少于75%!)

更改值以丢失百分比,然后使用数字运算符是可行的方法。

s/%//g for @values;
print join "\n", sort { $a <=> $b } @values;

答案 4 :(得分:0)

只想指出awk在这里没用:

my $used_space = `df -h $LZE`;
$used_space =~ m/(\d+)%/;
$used_space = $1;

given ($used_space) {
    when ($used_space <  75) { print "OK - $used_space of disk space used by $LZE\n"; exit(0); }
...