Выполнить команду, когда grep находит совпадение

#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 ввод .