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

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

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

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

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

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 не является.
Interesting Posts

Проблема с совместно используемыми ключами ssh

BroadcastReceiver для местоположения

Что означают значки стрелок в подзаголовке?

Копирование файлов с помощью PuTTy (не PSCP или чего-нибудь еще, только PuTTy)

Беспроводной маршрутизатор, поддерживающий Bonjour между проводными и беспроводными устройствами

В Internet Explorer 10 Metro, как вы меняете домашнюю страницу?

Как сделать загрузочный USB с Windows 8?

Зачем устанавливать «просто меня», а не «всех»?

Как я могу установить Internet Explorer 7 и 8 в Windows 7?

Как узнать, загружен ли DVD или CD?

Как вычесть X дней с даты с помощью Java-календаря?

Настройка мелодии звонка в Android

Устанавливает ли Windows нераспределенное (неформатированное) пространство на SSD?

Как инициализируется std :: cout?

Есть ли способ конвертировать установленную программу, отличную от Chocolatey, в установленную Chocolatey?

Давайте будем гением компьютера.