2013-04-02 58 views
1

我有一個具有在其下面的片段Perl腳本:使用Perl分裂()命令來解析從du是命令輸出

@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$ 

如果我運行一個-0du命令,我看到:

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

我試圖弄清楚如何分割兩種格式,以便目錄名與下一個目錄的大小分開或分開。換句話說,我希望mylittlearray [0]等於24,mylittlearray [1]僅包含「ones」,mylittlearray [2]將包含「8」等等。

有關如何完成此任何想法?

+0

你能告訴我如何得到結果「24」而不是「24」嗎? | xargs {'print $ 1'}也不起作用 –

+0

我明白了:D 我必須給| xargs {'print \ $ 1'} –

回答

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

使用map代替split

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

謝謝大家,尋求幫助。我結束了一個不同的解決方案,但肯定讚賞反饋。 – Infosmak