我已经设法使用反划线将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);
}但是由于这不是一个数组,我不知道如何去做,除非有一种方法将我的系统输出存储为一个数组?
非常感谢。
发布于 2016-05-19 18:56:58
是的,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-19 17:55:11
使用散列切片方法如何?
#!/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-19 18:54:38
我完成的代码如下:
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没有去掉%的容量,所以我去掉了它,以便将它添加到我的数据库中。存储为数组。感谢大家的帮助和评论!
https://stackoverflow.com/questions/37319533
复制相似问题