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

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

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

tail -f logfile.log | grep -m 1 "Server Started" 

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

  • Хвост держится на дне после того, как я прокручиваю колесико
  • Windows XP эквивалент «хвост -f»?
  • Показывать, начиная со специальной строки, до специального регулярного выражения для команды хвоста Linux
  • Альтернатива для «tail -f», которая следует за именем файла
  • Tail -f не отслеживать изменения файла
  • Прокрутка в терминале (OS X) при запуске tail -f и ssh-ed в машину дает некоторые странные символы
  • 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 не является.
    Давайте будем гением компьютера.