Используя регулярные выражения и хвост для выполнения команды

Подобный этому вопросу, в Linux tcsh я хочу выследить файл журнала и когда я соответствую регулярному выражению, я хочу выполнить произвольную команду. Как я могу сделать это?

1
задан 20.03.2017, 12:16

4 ответа

В примечании плаката комментарий в том вопросе приводит к ТАК сообщение при отключении автобуферизации при использовании каналов. Решение состояло в том, чтобы использовать, освобождают буфер (от, ожидают), как в:

$ unbuffer tail -f foo | find-and-run "findwhat" "runwhat"

ответ wfaulk (плюс очистка ayrnieu) предоставляет нам сценарий find-run:

#!/usr/bin/perl
# run: find-and-run "regex-to-find" "commandtorun"
die "usage: $0 <regex> <exec-this> [exec-this-arg1 ...]\n"
   unless @ARGV >= 2;

my ($re, @run) = @ARGV; 

while (<>) {
        last if /$re/;
}
exec { $run[0] } @run;

Примечание 1: на Debian lenny необходимо будет установить "ожидать-dev" пакет; освободите буфер установлен как "expect_unbuffer".

Примечание 2: это полностью не тестируется и полностью немного наивно. для безопасности не используйте это. при использовании этого Вы, вероятно, хотите к одинарной кавычке, чтобы Ваш regex избежал замены/расширения оболочки.

Примечание 3: большое спасибо ayrnieu для завершения сценария и очистки.

2
ответ дан 12.12.2019, 08:18
  • 1
    умирает "использование: должностное лицо regex - это [arg1...] \n", если @ARGV> = 2; мой ($re, @run) = @ARGV;... продержитесь если / $re/;... должностное лицо {$run [0]} должностное лицо/система @run – ayrnieu 10.10.2009, 07:08
  • 2
    не так важно, но $1$ 2, как, определенно перестанет работать, и использование: просто хорошая идея. – ayrnieu 10.10.2009, 07:10
  • 3
    лучше: "использование: 0$ <regex> <должностное лицо - это> [<arg1>... <argn>] \n" подписка – ayrnieu 10.10.2009, 07:10

Это кажется подходящий для короткого сценария жемчуга:

#!/usr/bin/perl

while (<>) {
        last if /regex/;
}
system("ls");

Если Вы хотите обеспечить шаблон и команду с как отмеченные аргументы, см. документацию в perldoc Getopt::Std.

3
ответ дан 12.12.2019, 08:18
  • 1
    я действительно хотел" <> до/regex /"; для работы но я не мог заставить его произойти. – wfaulk 10.10.2009, 02:28
  • 2
    perl-Mwarnings-e 'скаляр <> до/a /' - отмечает предупреждение. – ayrnieu 10.10.2009, 04:12

В моем случае (на RHEL, я хотел tail -n 0 -f file | grep -m 1 pattern для завершения сразу, когда шаблон происходит в растущем файле) простое использование освобождать буфер утилиты от Ожидать пакета не решило проблему по некоторым причинам.

Но на основе сообщения в блоге (http://www.smop.co.uk/blog/index.php/2006/06/26/tail-f-and-awk/) я обнаружил, что перенаправление входа от хвоста, запущенного в подоболочке, добилось цели:

grep -m 1 pattern <(tail -n 0 -f file)

Это не было столь же просто, все же. При работе в интерактивной оболочке та же команда, когда выполнено удаленно с помощью SSH, все еще заморозилась, как обычно:

ssh login@hostname 'grep -m 1 pattern <(tail -n 0 -f file)'

Я обнаружил, что в этом случае, нужно освободить буфер, вывод хвоста с помощью освобождать буфер утилиты от Ожидает:

ssh login@hostname 'grep -m 1 pattern <(unbuffer -p tail -n 0 -f file)'

Это не должно использоваться на интерактивной оболочке - освобождают буфер, вызовет ioctl(raw): I/O error!

Таким образом, совет для Вас состоит в том, что, если предлагаемые решения не работают, попытайтесь запуститься tail -f в подоболочке и если Вы хотите сделать это в сценарии или на неинтерактивной оболочке, с помощью unbuffer или unbuffer -p мог бы требоваться.

BTW, см. эту статью для полного объяснения выходной проблемы буферизации: http://www.pixelbeat.org/programming/stdio_buffering/

1
ответ дан 12.12.2019, 08:18

Другой подход должен использовать программу как образец. Образец создается, чтобы сделать точно, что Вы говорите о плюс дюжина других вещей.

0
ответ дан 12.12.2019, 08:18

Теги

Похожие вопросы