来自系统命令的perl过滤器输出

时间:2014-04-08 09:55:35

标签: perl sed awk

我尝试从简单的perl命令获取特定输出,并将其写入变量以在我的脚本中的后续体育场中使用。

我必须遵循以下代码:

#!/usr/bin/perl

use strict;
use warnings;


my $serial = system("hdparm -I /dev/sda | grep 'Serial Number:'");
print $serial;

这会生成以下输出:

0root@spool-B-01:~# ./test.pl
    Serial Number:      9VS3D79X

但我需要输出如下:

0root@spool-B-01:~# ./test.pl
9VS3D79X

我用awk和sed尝试过一些东西。但是那不会以我需要的方式提供输出。

例如:

#!/usr/bin/perl

use strict;
use warnings;
use Sys::Hostname;


my $serial = system("hdparm -I /dev/sda | grep 'Serial Number:' | sed -e 's/Serial Number://g'");
print $serial;

显示输出如:

0root@spool-B-01:~# ./test.pl
          9VS3D79X

这几乎是正确的,但您仍然可以在序列号之前找到标签。

我希望有人可以帮助我弄清楚这些东西并以正确的方式去做。

3 个答案:

答案 0 :(得分:3)

有多种方法可以从perl启动系统命令:系统 exec backtic 是最受欢迎的选择。有些捕获输出,有些则没有。如需理解,请查看以下链接:What's the difference between Perl's backticks, system, and exec?

然而,在这种情况下,反引用是最合适的:

例如快速脚本,例如:

my $out = `ls`;
print "$out \n";

将ls的结果打印到屏幕上。

在你的情况下,我会尝试:

my $command = "hdparm -I /dev/sda | grep 'Serial Number:' | sed -e 's/Serial Number://g'";

my $serial = `$command`;
print $serial;  #white space 

#Remove whitespace
$serial =~ s/^(\s+)//g;  

print $serial;  #No white space

我面前有一台mac,所以我无法访问hdparm命令

关于空白删除\s是空白字符所以正则表达式

s/^\s+//g;

转换为从行首开始替换所有空格

答案 1 :(得分:2)

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

open my $fh, '-|', 'hdparm -I /dev/sda';
while (<$fh>) {
    print "$_\n" if s/Serial Number://g;
}
close $fh

答案 2 :(得分:-1)

试试这个:

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

my @serial = `hdparm -I /dev/sda`;
foreach my $line (@serial) {
  print $1 if ($line =~ /(?:\s+)Serial Number:(?:\s+)(\w+)/);
}

输出:

root@spool-B-01:~# ./test.pl
9VS3D79X