2013-04-02 4 views
1

У меня есть сценарий Perl, который имеет следующий фрагмент кода в нем:Используя раскол 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 и «одни», а не «ones8». Если я труба их команд в файл и включите сет-лист в VIM Я вижу следующее:

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

Если я запускаю команду du с -0, я вижу это:

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

I Я пытаюсь выяснить, как разделить любой формат, чтобы имена каталогов были разделены или разделены на размер для следующего каталога. Другими словами, я хочу, чтобы mylittlearray [0] равнялся 24, mylittlearray [1] содержал только «единицы», 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