使用Perl split()命令解析`du'命令的输出

时间:2013-04-02 18:44:08

标签: linux perl split du

我有一个Perl脚本,其中包含以下代码段:

@mylittlearray = split(/\/dir1\/dir2\//, `du --max-depth=1 \/dir1\/dir2\//`
print $mylittlearray[0];
print $mylittlearray[1];
print "\n";

输出

24    ones
8

mylittlearray [0]和[1]应仅返回24和“ones”,而不是“ones8”。如果我将du命令传递给文件并打开VIM中的set list,我会看到以下内容:

24^I./ones$
8^I./twos$

如果我使用du运行-0命令,我会看到:

24      ./ones^@8       ./twos^@8       ./threes^@8     ./fours^@8      ./fives^@80     .^@

我正在试图弄清楚如何拆分任一格式,以便将目录名称与下一个目录的大小分开或拆分。换句话说,我希望mylittlearray [0]等于24,mylittlearray [1]只包含“ones”,mylittlearray [2]将包含“8”等等

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:3)

您的问题并没有明确说明,但如果您只是想从du收集每个结果条目的数据,请循环结果如下:

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

# Capture the output from du
my @array = `du --max-depth=1 /some/folder/`;

# Loop over the output
foreach (@array)
{
    chomp; # Strip new-line
    my ($size, $dir) = split; # Split on whitespace
    print "Dir: $dir, Size: $size\n";
}

答案 1 :(得分:1)

使用map代替split

my $dir = "/dir1/dir2/";
my @mylittlearray = map { m!(\d+)\s+$dir(.*)! } `du --max-depth=1 '$dir'`;
print join(", ", @mylittlearray), "\n";