我有这个Perl代码只打印第一行而不是所有行.
use Net::SSH::Perl;
my $user = "user";
my $cmd = "df -m | grep data";
my $host = "host1.example.com";
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user);
my ($dflines,$errors,$exit) = $ssh->cmd($cmd);
foreach $line ($dflines) {
print "$line";
my @values = split(' ',$line);
my ($MBsize, $MBused, $MBavail, $dir) =
($values[1], $values[2], $values[3], $values[5]);
print "MBsize=$MBsize MBused=$MBused MBavail=$MBavail dir=$dir\n";
}
Run Code Online (Sandbox Code Playgroud)
它打印:
/dev/sdb1 1407118 931813 403828 70% /data1
/dev/sdc1 1407118 921739 413902 70% /data2
/dev/sdd1 1407118 909408 426233 69% /data3
/dev/sde1 1407118 918828 416813 69% /data4
/dev/sdf1 1407118 922335 413306 70% /data5
MBsize=1407118 MBused=931813 MBavail=403828 dir=/data1
Run Code Online (Sandbox Code Playgroud)
我希望:
/dev/sdb1 1407118 931813 403828 70% /data1
/dev/sdc1 1407118 921739 413902 70% /data2
/dev/sdd1 1407118 909408 426233 69% /data3
/dev/sde1 1407118 918828 416813 69% /data4
/dev/sdf1 1407118 922335 413306 70% /data5
MBsize=1407118 MBused=931813 MBavail=403828 dir=/data1
MBsize=1407118 MBused=921739 MBavail=413902 dir=/data2
MBsize=1407118 MBused=909408 MBavail=426233 dir=/data3
MBsize=1407118 MBused=918828 MBavail=416813 dir=/data4
MBsize=1407118 MBused=922335 MBavail=413306 dir=/data5
Run Code Online (Sandbox Code Playgroud)
我几乎肯定它是基本的东西.任何帮助表示赞赏.谢谢!
TLP*_*TLP 16
问题是这一行:
foreach $line ($dflines) {
Run Code Online (Sandbox Code Playgroud)
您只执行一次迭代,因为它不是数组,而是标量.当print "$line"它实际打印你捕获的所有行时,但我想你看起来像是在循环中打印了许多值.在随后的部分:
my @values = split(' ',$line);
my ($MBsize, $MBused, $MBavail, $dir) =
($values[1], $values[2], $values[3], $values[5]);
print "MBsize=$MBsize MBused=$MBused MBavail=$MBavail dir=$dir\n";
Run Code Online (Sandbox Code Playgroud)
您只使用拆分的前几个值,但该行的其余部分也在那里.换句话说,@values包含您期望的所有值.范围0..5包含第一行,下一个是6..10,依此类推.由于您只使用前6个值,因此您看不到它们.
快速修复可能是这样做的:
foreach $line (split /\n/, $dflines) {
Run Code Online (Sandbox Code Playgroud)
这会像你期望的那样打破你的输入.
一些技巧:
总是 use warnings; use strict;
你应该使用一些适当的perl功能:
for my $line (split /\n/, $dflines) {
print $line;
my @values = split ' ', $line;
printf "MBsize=%s MBused=%s MBavail=%s dir=%s\n", @values[1,2,3,5];
}
Run Code Online (Sandbox Code Playgroud)
看起来你想要MBsize ...在常规输出后打印线条.如果是这样,您可以将行存储在数组中并在循环后打印:
my @print;
for my $line (split /\n/, $dflines) {
print $line;
my @values = split ' ', $line;
push @print, sprintf "MBsize=%s MBused=%s MBavail=%s dir=%s\n", @values[1,2,3,5];
} # note ----^ sprintf instead
print @print;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2517 次 |
| 最近记录: |