0

我已经设法使用反引号将我的df -lh命令存储为变量,$var但我想将其拆分,以便可以将变量的每个部分分配给另一个变量。

这是我打印时的输出$var

Filesystem     Size   Used  Avail Capacity  iused     ifree %iused  Mounted on
/dev/disk0s2  931Gi   82Gi  849Gi     9% 21503280 222477462    9%   /
/dev/disk1s2   19Gi  5.0Gi   14Gi    27%  1303373   3579438   27%   /Volumes/Install OS X Yosemite
/dev/disk1s3  1.8Ti  174Gi  1.6Ti    10% 45714072 437656799    9%   /Volumes/store

我想要的是删除第一行标题,然后将其拆分为以下类别:

$filesystem, $size, $used, $avail, $cap, $mounted.

我尝试使用 shift 来摆脱第一行,但我现在知道这仅适用于数组。对于我拥有的不同数组,我使用 chomp,即

foreach my $line (@output) {
              chomp $line;
              my( $filesystem, $size, $used, $avail, $cap, $mounted ) = split (/\s+/, $line);
}

但由于这不是一个数组,我不知道该怎么做,除非有办法将我的系统输出存储为数组?

非常感谢。

4

3 回答 3

3

是的,shift确实适用于数组。但是列表上下文中的反引号将返回命令输出的行列表。您可以将该列表分配给一个数组,然后shift将标题行从开头

这是您可能编写的示例,以及在我的 VBox 系统上运行它时的输出。我对这些字段所做的只是打印它们的值,因为你没有提到你可能想用它们做什么

use strict;
use warnings 'all';
use feature 'say';

my @df = `df -l`;

shift @df;
chomp @df;

for ( @df ) {
    my ( $filesystem, $size, $used, $avail, $cap, $mounted ) = split ' ', $_, 6;
    say "( $filesystem, $size, $used, $avail, $cap, $mounted )";
}

输出

( udev, 1004960, 0, 1004960, 0%, /dev )
( tmpfs, 204852, 6264, 198588, 4%, /run )
( /dev/sda1, 49409840, 4925512, 41951416, 11%, / )
( tmpfs, 1024260, 132, 1024128, 1%, /dev/shm )
( tmpfs, 5120, 4, 5116, 1%, /run/lock )
( tmpfs, 1024260, 0, 1024260, 0%, /sys/fs/cgroup )
( tmpfs, 204852, 52, 204800, 1%, /run/user/1000 )
( /dev/sr0, 56782, 56782, 0, 100%, /media/rob/VBOXADDITIONS_5.0.18_106667 )
于 2016-05-19T10:56:58.410 回答
1

使用哈希切片方法怎么样?

#!/usr/bin/env perl
use strict;
use warnings;

use Data::Dumper;

chomp ( my @header = split ' ', <DATA>, 9 ); 

my @rows; 
while ( <DATA> ) { 
   chomp; 
   my %this_row;
   push @rows, \%this_row;
   @this_row{@header} = split ' ', $_, 9; 
   print Dumper \%this_row;
}

print Dumper \@rows; 


foreach my $row ( @rows ) { 
   print $row -> {Filesystem}, " => ", $row -> {Size},"\n";
}


__DATA__
Filesystem     Size   Used  Avail Capacity  iused     ifree %iused  Mounted on
/dev/disk0s2  931Gi   82Gi  849Gi     9% 21503280 222477462    9%   /
/dev/disk1s2   19Gi  5.0Gi   14Gi    27%  1303373   3579438   27%   /Volumes/Install OS X Yosemite
/dev/disk1s3  1.8Ti  174Gi  1.6Ti    10% 45714072 437656799    9%   /Volumes/store

我们指定要拆分的计数,因为看起来它只是您最后一个包含空格的字段。(否则你会有另一列'on'并且'Install OS X Yosemite'也会被拆分)。

这构建了一个像这样的数据结构:

$VAR1 = [
          {
            'Filesystem' => '/dev/disk0s2',
            'Mounted on' => '/',
            'Avail' => '849Gi',
            '%iused' => '9%',
            'Size' => '931Gi',
            'iused' => '21503280',
            'Capacity' => '9%',
            'Used' => '82Gi',
            'ifree' => '222477462'
          },
          {
            'Capacity' => '27%',
            'iused' => '1303373',
            'Size' => '19Gi',
            '%iused' => '27%',
            'Filesystem' => '/dev/disk1s2',
            'Mounted on' => '/Volumes/Install OS X Yosemite',
            'Avail' => '14Gi',
            'ifree' => '3579438',
            'Used' => '5.0Gi'
          },
          {
            'ifree' => '437656799',
            'Used' => '174Gi',
            'Capacity' => '10%',
            'iused' => '45714072',
            '%iused' => '9%',
            'Size' => '1.8Ti',
            'Avail' => '1.6Ti',
            'Mounted on' => '/Volumes/store',
            'Filesystem' => '/dev/disk1s3'
          }
        ];

这是一个哈希数组。(例如,每个值都是“键控”)。

但是您可以做类似的事情,split将值放入数组中。

于 2016-05-19T09:55:10.513 回答
0

我完成的代码:

 my @var= `df -l`;
      my $local_id = 2;
      shift @var; ## REMOVE TOP LINE
      foreach my $line (@var) {
          chomp $line;
          my( $filesystem, $size, $used, $avail, $cap, $mounted ) = split (/\s+/, $line);
          ## DIRTY QUICK WAY TO PULL OFF %
          $cap = substr($cap, 0, -1);
}

Df -l 并没有摆脱容量的百分比,所以为了将它添加到我的数据库中而摆脱了它。存储为数组。感谢大家的帮助和评论!

于 2016-05-19T10:54:37.673 回答