Как что-то сделать с Bash, когда в файле появляется текстовая строка
Вопрос
Я хочу запустить команду, как только в файле журнала появится определенный текст.Как мне это сделать в 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 — это программа, которая в первую очередь генерирует файл журнала.Эта модификация выполняет «что-то», как только волшебная строка находится.