Как сделать что-то с Bash, когда в файле появляется текстовая строка - PullRequest
4 голосов
/ 01 октября 2008

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

Ответы [ 5 ]

14 голосов
/ 01 октября 2008

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

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

Здесь ключ --line-buffered, иначе чтение не удастся.

5 голосов
/ 01 октября 2008

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

tail -f file.log | while read line; do if [[ $line == *text* ]]; then
    mycommand
fi; done
1 голос
/ 05 октября 2008

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

1 голос
/ 01 октября 2008

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

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

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

0 голосов
/ 01 октября 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...