Добавление || регулярное выражение в bash `` однострочное в Perl-скрипте - PullRequest
0 голосов
/ 13 октября 2011

Я пытаюсь добавить ||regex в bash `` однострочник в Perl-скрипте, если это имеет смысл.

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

# .Private maybe the same as /dev/sdb1 so I'm trying to remove it too 
# by trying to add || (m/\.Private/) to the above

print  "$result";

Поэтому я удаляю строки из вывода, которые начинаются с Filesystem, tmpfs, cdrom или none, внастоящее время, но я также хотел бы и "или строки, содержащие .Private" для однострочника, если это возможно ...

У меня также есть ниже, но я хочу воспроизвести его результаты с приведенным выше кодом...

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

Ответы [ 4 ]

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

Я бы порекомендовал полностью избавиться от части "awk". Вызывать awk изнутри perl глупо.

Вместо этого полагайтесь на захват строк, используя контекст списка, а затем выполняйте обработку внутри perl.

my @lines = <code>df -H;

my @results = grep ... @lines; # perl 'grep' встроенный

Если вы настаиваете на использовании unix grep, почему бы просто не добавить '| .Private' в шаблон исключения grep?

0 голосов
/ 13 октября 2011

Вам просто нужно добавить часть \.Private к текущему регулярному выражению:

grep -vE '^Filesystem|tmpfs|cdrom|none|\.Private'

Что касается примечания, шаблон ^Filesystem|tmpfs|cdrom|none может на самом деле не выполнять то, что вы хотите, поскольку только Filesystem сопоставляется в начале строки, остальные части будут сопоставляться, если они появятся где-либо на входе. Чтобы соответствовать им в начале, измените его на:

'^Filesystem|^tmpfs|^cdrom|^none'
0 голосов
/ 13 октября 2011

Как это?

my $result = `df -H | grep -vE '(^Filesystem|tmpfs|cdrom|none)|\.Private'  | awk '{ print \$1 "\t" \$5 " used."}'`; 
0 голосов
/ 13 октября 2011

Ваше регулярное выражение не делает то, что вы думаете, что оно делает.Он соответствует строкам, которые начинаются с Fileystem или содержат где-либо другие слова.

Попробуйте с этим:

grep -vE '^(Filesystem|tmpfs|cdrom|none)|\.Private'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...