[英]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启动系统命令: system , exec和backtic是最受欢迎的选择。 有些捕获输出,有些则没有。 为了获得良好的调试,请检查以下链接: 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.