首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl:从系统输出中拆分变量(df -lh)

Perl:从系统输出中拆分变量(df -lh)
EN

Stack Overflow用户
提问于 2016-05-19 17:45:51
回答 3查看 465关注 0票数 0

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

以下是我打印$var时的输出

代码语言:javascript
复制
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,即

代码语言:javascript
复制
foreach my $line (@output) {
              chomp $line;
              my( $filesystem, $size, $used, $avail, $cap, $mounted ) = split (/\s+/, $line);
}

但是由于这不是一个数组,我不知道如何去做,除非有一种方法将我的系统输出存储为一个数组?

非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2016-05-19 18:56:58

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

下面是您可能编写的代码示例,以及我在VBox系统上运行它时的输出。我对这些字段所做的全部操作就是打印它们的值,因为您还没有提到您可能想要对它们做什么

代码语言:javascript
复制
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 )";
}

输出

代码语言:javascript
复制
( 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 )
票数 3
EN

Stack Overflow用户

发布于 2016-05-19 17:55:11

使用散列切片方法如何?

代码语言:javascript
复制
#!/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'也将被拆分)。

这将构建如下的数据结构:

代码语言:javascript
复制
$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到一个数组中。

票数 1
EN

Stack Overflow用户

发布于 2016-05-19 18:54:38

我完成的代码如下:

代码语言:javascript
复制
 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没有去掉%的容量,所以我去掉了它,以便将它添加到我的数据库中。存储为数组。感谢大家的帮助和评论!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37319533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档