我尝试从简单的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
这几乎是正确的,但您仍然可以在序列号之前找到标签。
我希望有人可以帮助我弄清楚这些东西并以正确的方式去做。
答案 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