【问题标题】:Using the Perl split() command to parse the output from the `du' command使用 Perl split() 命令解析 `du' 命令的输出
【发布时间】:2013-04-02 18:44:07
【问题描述】:

我有一个 Perl 脚本,其中包含以下 sn-p:

@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 中打开设置列表,我会看到以下内容:

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

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

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

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

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

【问题讨论】:

  • 你能告诉我如何得到结果“24”而不是“24 个”吗? |xargs {'print $1'} 也不起作用
  • 我知道了:我必须给 |xargs {'print \$1'}

标签: linux perl split du


【解决方案1】:

您的问题不太清楚,但如果您只是对从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";
}

【讨论】:

    【解决方案2】:

    使用map 代替split

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

    【讨论】:

    • 谢谢大家的帮助。我最终得到了不同的解决方案,但绝对感谢您的反馈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多