Как что-то сделать с Bash, когда в файле появляется текстовая строка

StackOverflow https://stackoverflow.com/questions/157163

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу запустить команду, как только в файле журнала появится определенный текст.Как мне это сделать в Bash?

Это было полезно?

Решение

Использовать команду

tail -f file.log | grep --line-buffered "my pattern" | while read line
do
  echo $line
done

А --line-buffered здесь является ключевым моментом, иначе чтение завершится неудачей.

Другие советы

Использование только tail:

tail -f file.log | while read line; do if [[ $line == *text* ]]; then
    mycommand
fi; done

Это должно работать даже без GNU grep:

tail -f -n 0 logfile.out | nawk '/pattern/ {system("echo do something here")}'

редактировать:Добавлен «-n 0», чтобы сопоставляться только новые вхождения текста.

Также вы можете посмотреть inotail, замена для tail -f который использует inotify framework, чтобы просыпаться только тогда, когда интересующий вас файл изменился.Обычно tail -f просто спит в течение коротких периодов времени между опросами, что является эффективным, но не очень эффективным решением.

Мне нравится ответ Матли.Ответ Бруно Де Фрейна хорош еще и тем, что он использует только команды оболочки, а не другие программы (например, awk).Проблема заключается в том, что вся строка должна соответствовать волшебной строке.Из вопроса не ясно, что это часть требования.

Я бы немного изменил его, чтобы разобраться с предложением «как только» в исходном вопросе.

logfile_generator | tee logfile.out | nawk '/pattern/ {system("echo do something here")}'

где logfile_generator — это программа, которая в первую очередь генерирует файл журнала.Эта модификация выполняет «что-то», как только волшебная строка находится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top