繁体   English   中英

系统命令的perl过滤器输出

[英]perl filter output from system command

我尝试从简单的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

几乎是正确的,但是在序列号之前您仍然可以看到选项卡。

我希望有人可以帮助我弄清楚这些问题并以正确的方式进行。

有多种方法可以从perl启动系统命令: systemexecbacktic是最受欢迎的选择。 有些捕获输出,有些则没有。 为了获得良好的调试,请检查以下链接: Perl的反引号,系统和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;

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

#!/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

尝试这个:

#!/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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM