Воспроизведение результатов: используйте Shell; - PullRequest
0 голосов
/ 09 октября 2011

Я пытаюсь воспроизвести одни и те же результаты тремя разными способами, но мне сложно понять, как заставить его работать при использовании «use Shell»; (метод 2a ниже), любая помощь?

#!/usr/bin/perl
# v5.10.1 / linux
use strict;
use warnings;
use Shell;

# method 1 start
my $result = `df -H | grep -vE '^Filesystem|tmpfs|cdrom|none' | awk '{ print \$5 "\t" \$1}'`;
print $result . "\n";
# end of method 1

# I would like to try to reproduce the above but by using "use Shell", even if the above is already somehow using such anyway?!
# method 2a start
my $result2 = df ("-H");  # use powers of 1000 not 1024 # human readable
print $result2 . "\n"; # I can only get it working up to here 
# end 2a

# 2b) 
# or use regexs on df -H's output
my @linesofoutput= $result2=~/(.*?)\n/g; # needs checking to see if I'm getting the lines right with this?!

 foreach my $temp(@linesofoutput){

if (($temp  =~ /^Filesystem/)||($temp  =~ /^tmpfs/)||($temp  =~ /^cdrom/)||($temp  =~ /^none/)){ 
    # do nothing for lines starting with Filesystem, tmpfs or cdrom or none
     # print "Do not show:  $temp\n";
}else{
            #print "$temp\n";  # lines wanted
                 my  @words = split(/\s/, $temp);           # make an array out of each line, splitting on any whitespace character: space, tab, newline, etc
                 @words = grep(!/^$/, @words);            # remove empty elements.  check this(not starting with, ending with)???

                 print "$words[4]". "\t"."$words[0]"."\n";          # filesystem entries are in index0, size index1, used index2, avail 3...
                 # be careful of /path/name of file or folder... because of the gaps, and so they could be made up of multi indexs
            }
 }
 # end of method 2b

1 Ответ

2 голосов
/ 09 октября 2011

Если я правильно понимаю, метод 2a) должен направить вывод df -H в grep, а это должно * awk. Короче говоря: вы хотите выполнить весь процесс перенаправления метода 1, который выполняется неявно запущенной оболочкой в ​​perl.

Пакет Shell НЕ поможет вам здесь. Единственная цель этого пакета состоит в том, чтобы вы могли легко вызывать команду one . Так что df("-H") работает, но это все.

Это не большая потеря, если вы подумаете об этом: все, что вам нужно, это вывод df. Остальное - анализ и обработка этого вывода - то, что должно быть сделано в самом Perl. Так что метод 2b - лучший способ - если вы немного отполируете его так:

my @lines = df("-H");
shift @lines;   # get rid of "Filesystem..."
for( @lines ){
    next if /^tmpfs|cdrom|none/;
    my @words = split('\s+', $_);
    print $words[4], "\t", $words[0], "\n";
}

Я также могу предложить метод 3: заменить вызов "df -H" чем-то из perl. Вот некоторые модули CPAN, которые используют системный вызов statfs(2) или statvfs(2):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...