【问题标题】:perl filter output from system commandperl 过滤系统命令的输出
【发布时间】:2014-04-08 21:25:46
【问题描述】:

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

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

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

【问题讨论】:

  • sed -e 's/Serial Number:|\s//g' ?
  • 如果您使用 Perl 编码,为什么要使用 grepawksed 等?
  • 试试sed -e 's/^\s\+序列号://g'

标签: perl sed awk


【解决方案1】:

从 perl 启动系统命令有多种方式:systemexecbacktic 是最受欢迎的选择。有些捕获输出,有些则没有。如需了解详细信息,请查看此链接: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;

翻译成从行首开始的所有空白都替换为空

【讨论】:

  • 是的,这行得通。但我仍然得到序列号之前的标签。知道如何解决这个问题吗?
  • 可能类似于 $serial ~= s/\s//g;
【解决方案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

【讨论】:

    【解决方案3】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2014-08-16
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多