#bash
#bash
Вопрос:
У меня есть программа, которая постоянно запускается и передается в grep, и время от времени grep находит совпадение. Я хочу, чтобы мой скрипт bash выполнялся, когда grep находит совпадение.
Вот так:
program | grep "pattern"
grep выводит -> script.sh выполняет
Комментарии:
1. Вы захотите сохранить
grep
результаты в переменной, а затем использовать встроенный синтаксис bash дляif
условного запуска другой команды2. Но grep никогда не завершает выполнение, просто продолжает откачивать выходные данные, когда находит совпадение в выходных данных программы. Как сохранить это в переменной?
Ответ №1:
Если я правильно понял ваш вопрос (часть «время от времени grep находит совпадение»), ваша программа выдает положительный шаблон несколько раз в течение длительного времени выполнения, и вы хотите script.sh
запустить в эти моменты времени.
Когда вы подключаетесь program
к grep и просматриваете код выхода greps с amp;amp;
помощью, вы выполняете script.sh
только один раз и только в конце program
времени выполнения.
Если мои предположения верны (что вы хотите script.sh
запустить несколько раз), то вам нужна «если тогда логика» за |
символом. Один из способов сделать это — использовать awk вместо grep:
program | awk '/pattern/ {system("./script.sh")}'
/pattern/ {system("./script.sh")}
в одинарных кавычках находится сценарий awk/pattern/
инструктирует awk искать совпадающие строкиpattern
и выполнять инструкции внутри следующих фигурных скобокsystem("./script.sh")
внутри фигурных скобок за/.../
выполняетscript.sh
in текущий каталог с помощьюsystem
команды awks
Общий эффект таков: script.sh
выполняется так часто, как совпадают строки pattern
в выходных program
данных .
Другой способ сделать это — использовать sed
:
program | sed -n '/pattern/ e ./script.sh'
-n
запрещает sed печатать каждую строку вprogram
s out put/pattern/
является ли критерий фильтра для строк вprogram
выводе s: строки должны совпадатьpattern
e ./script.sh
это действие, которое sed выполняет, когда строка соответствует шаблону: он выполняет вашscript.sh
Ответ №2:
Используйте параметр и -q
синтаксис grep amp;amp;
, например:
program | grep -q "pattern" amp;amp; sh script.sh
где:
-q
: Выполняется в тихом режиме, но немедленно завершается с нулевым статусом, если найдено какое-либо совпадение
amp;amp;
: используется для объединения команд в цепочку, так что следующая команда выполняется тогда и только тогда, когда предыдущая команда завершилась без ошибок (или, точнее, завершается с кодом возврата 0). Объяснено здесь .
sh script.sh
: Будет выполняться только в том случае, если найден «шаблон»
Комментарии:
1. Я понимаю, что в исходном вопросе задается вопрос о непрерывном мониторинге вывода программы, поэтому однократное выполнение grep и script.sh этого недостаточно. Ответ Ларса Фишера ниже касается непрерывного выполнения.
Ответ №3:
Эквивалентно ответу @masterguru, но, возможно, более понятно:
if program | grep -q "pattern"
then
# execute command here
fi
grep
возвращает нулевой статус выхода при обнаружении совпадения, поэтому его можно использовать как условный if
ввод .