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

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

Обновлено: Последовательность здесь: -Звоните другую программу. -Запустить регулярное выражение для его вывода.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
7 198
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

#!/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;

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

возможно, было бы лучше заменить оператор печати блоком do.

Geo 22.01.2009 20:06

При этом не выполняется никаких «(жестко запрограммированных) вызовов командной строки», а просто читается и действует стандартный ввод.

ephemient 22.01.2009 20:22

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

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

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

Это будет происходить сотни раз, и я собираюсь добавить выходной файл, так что да. Но ваша команда очень похожа на ту, которую будет использовать Perl: P

alexwood 22.01.2009 20:15

для выходного файла «галстук». Но сотни раз ... Может быть, Perl.

user3458 22.01.2009 20:23

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

Ответ принят как подходящий
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 для более подробной информации.

Или как я это реализовал: for (@output) {my_action () if / regex /; } Позволяя мне делать все, что я захочу, если я получу удар. Спасибо!

alexwood 22.01.2009 20:30

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

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

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

Разве вы не пропустили здесь флаг -n?

reinierpost 02.11.2009 17:37

Вы действительно используете однострочник в таком случае. Недавно я составил код, который я использую, среди прочего, для создания вывода, в котором перечисляется структура каталогов, присутствующая в архиве .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 перебирать каждую входную запись (строку), и то, что вы можете делать, неограниченно с точки зрения сложности.

Другие вопросы по теме