Мониторинг файла до тех пор, пока не будет найдена строка

Я использую tail -f для мониторинга файла журнала, который активно записывается. Когда определенная строка записывается в файл журнала, я хочу завершить мониторинг и продолжить работу с остальным моим скриптом.

В настоящее время я использую:

  • Создайте много tar-файлов из каталога с 500000 файлами
  • Как записать в экранное меню KDE или уведомление с консоли?
  • Удалить или переименовать файл с \ r в качестве имени файла
  • Как я могу создать сценарий создания резервных копий недавно измененных файлов в Bash?
  • Как я могу исправить свой пользовательский PS1 для переноса длинной команды на несколько строк вместо одной строки?
  • Использование инструмента командной строки cURL на Mac, что я могу сделать с этим скриптом, чтобы попросить его получить данные запаса, которые заменят запятые NO SPACES
  • tail -f logfile.log | grep -m 1 "Server Started" 

    Когда строка найдена, grep завершает работу, как и ожидалось, но мне нужно найти способ заставить команду tail завершить работу, чтобы сценарий мог продолжить.

  • Как автоматически перезапустить фоновый процесс linux, если он не работает?
  • RHEL 6: GNOME: просмотр файла * .desktop в оболочке, отличной от системной по умолчанию
  • Различия и выполнение `set` &` env`?
  • Выполнение tcpdump удаленно при локальном захвате пакетов
  • Как вы можете настроить подсказку терминала bash с помощью смайликов?
  • Рекурсивные перемещения файлов определенного типа на определенный путь
  • 2 Solutions collect form web for “Мониторинг файла до тех пор, пока не будет найдена строка”

    Принятый ответ не работает для меня, плюс он запутан, и он изменяет файл журнала.

    Я использую что-то вроде этого:

     tail -f logfile.log | while read LOGLINE do [[ "${LOGLINE}" == *"Server Started"* ]] && pkill -P $$ tail done 

    Если строка журнала соответствует шаблону, убейте tail запущенный этим скриптом.

    Примечание. Если вы хотите также просмотреть вывод на экране, либо | tee /dev/tty | tee /dev/tty или эхо-строку перед тестированием в цикле while.

    Простой однострочный POSIX

    Вот простой однострочный. Он не нуждается в баш-специфических или не-POSIX-трюках или даже в именованном канале. Все, что вам действительно нужно, – это отделить конец tail от grep . Таким образом, когда grep заканчивается, скрипт может продолжаться, даже если tail еще не закончился. Таким образом, этот простой способ поможет вам:

     ( tail -f -n0 logfile.log & ) | grep -q "Server Started" 

    grep будет блокироваться, пока не найдет строку, после чего она выйдет. Сделав tail из собственной суб-оболочки, мы можем поместить его в фоновом режиме, чтобы он работал независимо. Между тем основная оболочка может продолжить выполнение скрипта, как только выйдет grep . tail будет задерживаться в своей подчиненной оболочке, пока следующая строка не будет записана в файл журнала, а затем выйдет (возможно, даже после завершения основного сценария). Главное, что конвейер больше не ждет завершения tail , поэтому трубопровод выходит, как только выйдет grep .

    Некоторые незначительные изменения:

    • Параметр -n0 в tail заставляет его начинать чтение из текущей последней строки файла журнала, если строка существует ранее в файле журнала.
    • Возможно, вы захотите дать tail -F, а не -f. Это не POSIX, но позволяет tail работать, даже если журнал вращается во время ожидания.
    • Опция -q, а не -m1, выгружает grep после первого появления, но не распечатывает триггерную линию. Также это POSIX, который -m1 не является.
    Давайте будем гением компьютера.