Как дождаться появления определенной строки в файле

Как дождаться появления определенной строки в файле

21.09.2014 05:48:57 Просмотров 17 Источник

Можно ли написать сценарий, который не будет выполняться до тех пор, пока данная строка не появится в конкретном файле?

Например, я хочу сделать что-то вроде этого:

CANARY_LINE='Server started'
FILE='/var/logs/deployment.log'

echo 'Waiting for server to start'
.... watch $FILE for $CANARY_LINE ...
echo 'Server started'

В основном, скрипт оболочки, который следит за файлом для строки (или регулярного выражения).

У вопроса есть решение - Посмотреть?

Ответы - Как дождаться появления определенной строки в файле / How to wait till a particular line appears in a file

Является ответом!
Xavier S.

21.09.2014 05:58:45

Мы должны быть осторожны с петлями.

Например, если вы хотите проверить файл для запуска алгоритма, вам, вероятно, придется сделать что-то вроде этого:

  FILE_TO_CHECK="/var/logs/deployment.log"
  LINE_TO_CONTAIN="Server started"
  SLEEP_TIME=10
  while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ]
  do
      sleep ${SLEEP_TIME}
  done

  # Start your algorithm here

Но, чтобы предотвратить бесконечный цикл, вы должны добавить некоторую привязку:

  FILE_TO_CHECK="/var/logs/deployment.log"
  LINE_TO_CONTAIN="Server started"
  SLEEP_TIME=10
  COUNT=0
  MAX=10
  while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") -a ${COUNT} -lt ${MAX} ]
  do
      sleep ${SLEEP_TIME}
      COUNT=$(($COUNT + 1))
  done

  if [ ! $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ]
  then
    echo "Let's go, the file is containing what we want"
    # Start your algorithm here
  else
    echo "Timed out"
    exit 10
  fi
https://stackoverflow.com/questions/25959870/how-to-wait-till-a-particular-line-appears-in-a-file/25959953#comment40644360_25959953
$(SLEEP_TIME)должно быть ${SLEEP_TIME}. Нет никакой необходимости в кошке и трубе для грэпа. А прописные переменные-это плохая привычка.
https://stackoverflow.com/questions/25959870/how-to-wait-till-a-particular-line-appears-in-a-file/25959953#comment40644415_25959953
Спасибо за этот комментарий. Я уже установил ${SLEEP_TIME}. Что касается соглашения об именовании, вы правы, использование нижнего регистра кажется лучшей идеей, чтобы не переопределять переменную окружения.
https://stackoverflow.com/questions/25959870/how-to-wait-till-a-particular-line-appears-in-a-file/25959953#comment40644522_25959953
Разве логика в цикле while не перевернута? Это будет цикл, пока grep находит что-то, и остановить, когда это не делает. как насчет чего-то вроде until grep -q string file ; do sleep 1s ; done?
https://stackoverflow.com/questions/25959870/how-to-wait-till-a-particular-line-appears-in-a-file/25959953#comment40650184_25959953
grep возвращает 0, когда он находит совпадение, в противном случае он возвращает 1. unixhelp.Эд.переменного тока.Великобритания/ЦГИ/человек-цги?грэп
https://stackoverflow.com/questions/25959870/how-to-wait-till-a-particular-line-appears-in-a-file/25959953#comment40650436_25959953
Действительно, но помещая его внутрь [ $() ], это означает выходное значение [controls while, и он просто проверит, является ли вывод команды ( $()) непустой строкой. Вы можете попробовать это с if [ $( true ) ] ; then echo true ; fi.
Biffen

21.09.2014 11:54:20

Попробовать это:

#!/bin/bash

canary_line='Server started'
file='/var/logs/deployment.log'

echo 'Waiting for server to start'

until grep -q "${canary_line}" "${file}"
do
  sleep 1s
done

echo 'Server started'

Отрегулируйте sleepна свой вкус.

Если строка в файле должна точно совпадать, то есть вся строка, измените grep.

Если строка содержит какие-либо символы, которые "^${canary_line}$"считает особенными, вам придется решить эту проблему... как-то.

https://stackoverflow.com/questions/25959870/how-to-wait-till-a-particular-line-appears-in-a-file/25963245#comment40681866_25963245
Может привести к бесконечному циклу
https://stackoverflow.com/questions/25959870/how-to-wait-till-a-particular-line-appears-in-a-file/25963245#comment40683859_25963245
Да, он будет работать до тех пор, пока строка не появится в файле или пока она не будет убита. Я думал, что это то, чего хочет ОП.
https://stackoverflow.com/questions/25959870/how-to-wait-till-a-particular-line-appears-in-a-file/25963245#comment40684117_25963245
..бесконечный цикл , если вы спросите меня, - это тот, из которого программа не может выйти сама. И это не один из них.
Miloš Stanković

31.01.2020 11:11:10

tail -f path_to_my_log_file.log | sed '/particular_line/ q'
Закрыть X