2

我在 Ubuntu 12.04 机器上从我的 Perl 脚本中的变量中提取某些值时遇到了一些麻烦。

我查看了这个页面:如何按照模式提取字符串

这就是我想做的。我需要在某种模式之后提取一个字符串值。这是我到目前为止的代码:

foreach $HDD (@sds)
{
    $hdStat = `hdparm -i $HDD | grep -Po 'Model=\K.*?(?=,)'`;
    $sdModel{$HDD} = $hdStat;
    $hdStat = `hdparm -i $HDD | grep -Po 'SerialNo=\K.*?(?=")'`;
    $sdSerial{$HDD} = $hdStat;
}
foreach $HDD (keys %sdModel)
{
    print $sdModel{$HDD};
}
foreach $HDD (keys, %sdSerial)
{
    print $sdSerial{$HDD};
}

它会很好地返回 Model 字符串,但不会返回 SerialNo 字符串。代码不必与 grep 一起使用;我刚刚修改了上面链接中的代码。看到我对正则表达式有多糟糕,我可能在这里遗漏了一些基本的东西。

顺便说一句,此代码的目的是查看 /dev 文件夹以查找任何磁盘驱动器,如果找到,则将其设置为一个数组,然后上面的脚本将在其中获取它的型号 # 和序列号。此外,如果有人看到更好的方法来做我正在做的事情,我非常愿意接受建议。我对 Perl 还是很陌生(到目前为止只使用了大约一周)。

4

2 回答 2

1

首先,您不打印 $sdSerial。

其次,您可以节省一些外部调用并简化您的正则表达式:

foreach my $HDD (@sds) {
    my @hdparm = `hdparm -i $HDD`;
    foreach my $ln (@hdparm) {
        if (my($model, $serial) = ($ln =~ m/Model=(.+?),.+?,\s*SerialNo=(.+)/)) {
            $sdModel{$HDD} = $model;
            $sdSerial{$HDD} = $serial;
        }
    }
}

以上可以简化为:

foreach my $HDD (@sds) {
    my $hdparm = `hdparm -i $HDD`;
    if (my($model, $serial) = ($hdparm =~ m/Model=(.+?),.+?,\s*SerialNo=(.+)/)) {
        $sdModel{$HDD} = $model;
        $sdSerial{$HDD} = $serial;
    }
}
于 2012-10-13T18:33:15.980 回答
0

为了提取序列号,试试这个正则表达式:

$hdStat = `hdparm -i $HDD | grep -Po 'SerialNo=\K.*?'`;
于 2012-10-13T18:29:08.690 回答