Как использовать Perl в командной строке для поиска выходных данных других программ? - PullRequest
6 голосов
/ 22 января 2009

Как я понимаю (Perl - новинка для меня), Perl можно использовать для написания сценариев для командной строки Unix. То, что я хочу сделать, это выполнить (жестко запрограммированные) вызовы командной строки и выполнить поиск в результатах этих вызовов совпадений RegEx. Есть ли способ сделать это просто в Perl? Как?

РЕДАКТИРОВАТЬ: последовательность здесь: Вызов другой программы. -Запустите регулярное выражение для его вывода.

Ответы [ 6 ]

10 голосов
/ 22 января 2009
my $command = "ls -l /";
my @output = `$command`;
for (@output) {
    print if /^d/;
}

Оператор квази-цитирования qx// (для которого ярлыки являются ярлыками) украден из синтаксиса оболочки: запустите строку как команду в новой оболочке и верните ее вывод (в виде строки или списка, в зависимости контекст). Подробнее см. perlop.

Вы также можете открыть трубу:

open my $pipe, "$command |";
while (<$pipe>) {
    # do stuff
}
close $pipe;

Это позволяет вам (а) избежать одновременного сбора всей команды в память и (б) дать вам более полный контроль над выполнением команды. Например, вы можете избежать синтаксического анализа команды оболочкой:

open my $pipe, '-|', @command, '< single argument not mangled by shell >';

Подробнее об этом см. perlipc.

5 голосов
/ 23 января 2009

Вы могли бы уйти без Perl, как уже упоминали другие. Однако, если вам нужна какая-то функция Perl, например, расширенные функции регулярных выражений или дополнительная обработка текста, вы можете направить вывод в perl, а затем делать то, что вам нужно. Переключатель Perl -e позволяет указать программу Perl в командной строке:

command | perl -ne 'print if /.../'

Есть несколько других ключей, которые вы можете передать perl, чтобы сделать его очень мощным в командной строке. Они задокументированы в perlrun . Также ознакомьтесь с некоторыми статьями в колонке Рэндала Шварца в обзоре Unix, особенно с его первой статьей . Вы также можете найти в Google Perl one liners , чтобы найти множество примеров.

2 голосов
/ 22 января 2009

В Perl вы можете использовать backticks для выполнения команд в оболочке. Вот документ об использовании обратных галочек . Я не уверен, как захватить вывод, но я уверен, что есть больше, чем способ сделать это .

2 голосов
/ 22 января 2009

Вам нужен Perl вообще? Как насчет

command -I use | grep "myregexp" && dosomething

прямо в оболочке?

2 голосов
/ 22 января 2009
#!/usr/bin/perl

sub my_action() {
        print "Implement some action here\n";
}

open PROG, "/path/to/your/command|" or die $!;
while (<PROG>) {
        /your_regexp_here/ and my_action();
        print $_;
}
close PROG;

Это отсканирует вывод вашей команды, сопоставит регулярные выражения и выполнит какое-либо действие (которое теперь печатает строку)

0 голосов
/ 20 апреля 2009

В таком случае вы действительно используете однострочник. Недавно я написал код, который я использую, среди прочего, для получения вывода, в котором перечислены структуры каталогов, присутствующие в архиве .zip (по одной записи в каждой строке). Таким образом, используя этот вывод в качестве примера вывода команды, который мы хотели бы отфильтровать, мы могли бы поместить канал и затем использовать perl с флагами -n -e для фильтрации входящих данных (и / или делать другие вещи с ним):

[command_producing_text_output] | perl -MFile::Path -n -e \
   "BEGIN{@PTM=()} if (m{^perl/(bin|lib(?!/site))}) {chomp;push @PTM,$_}" ^
-e "END{@WDD=mkpath (\@PTM,1);" ^
-e "printf qq/Created %u dirs to reflect part of structure present in the .ZIP file\n/, scalar(@WDD);}"

используемый синтаксис оболочки, в том числе: цитирование perl-кода и экранирование строк новой строки, отражает использование CMD.exe в консолях, подобных Windows NT. Если вам нужно, мысленно заменить «^» с «\» и «с» в соответствующих местах.

Вышеуказанная строка добавляет только имена каталогов, начинающиеся с "perl / bin" или "perl / lib (не сопровождается" / site "); затем он создает эти каталоги. с (пустым) деревом, которое вы можете использовать для любых злых целей, которые пожелаете.

Суть в том, чтобы проиллюстрировать, что доступны флаги (-n, -p) для разрешите perl циклически проходить по каждой входной записи (строке), и то, что вы можете сделать, не ограничено с точки зрения сложности.

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