LINUX.ORG.RU
ФорумAdmin

Парсинг лога на предмет последней нужной записи

 , ,


0

1

Приветствую. Надо в скрипте парсить определенный 'Status' в логе работы программы и при его появлении выполнить команду. Но таких 'старых' записей в логе уже туча, нужна актуальная, последняя запись, а в строке привязки к дате/времени/вообще/к/чему-либо нет.

tail --follow=name $HOME/log | while read line; do
	if [[ "X$line" = "XStatus" ]]; then command; fi
	done

-- даёт верный результат. Но мониторинг 'tail' остается же висеть. Как его убить в скрипте? Какая альтернатива 'tail'? Или что почитать?



Последнее исправление: mexx (всего исправлений: 1)

Запоминай последнуюю позицию в файле, в следующий раз начинай с неё. Tail тут вряд ли поможет, но на любом языке реализуется несложно

router ★★★★★
()
tail -n 1 $HOME/log | grep -m 1 "XStatus" ; command

Только тут есть проблема - отвалится grep после того как придет еще одна строка после нужной. Если лог пишется постоянно то не думаю что это будет сильно критично.

micronekodesu ★★★
()
Ответ на: комментарий от hanharr

Попробуйте так

То, что надо. Спасибо!

mexx
() автор топика
Ответ на: комментарий от router

Запоминай последнуюю позицию в файле, в следующий раз начинай с неё

Как это сделать в bash?

mexx
() автор топика
Ответ на: комментарий от micronekodesu

tail -n 1 $HOME/log | grep -m 1 "XStatus" ; command

Не понял мысль. Команда же будет выполняться независимо от результата чтения и выборки.

mexx
() автор топика
Ответ на: комментарий от mexx

Вам нужно выполнить команду после того как придет опеделенная строка, мой вариант это и делает - пока нужной строки нет grep будет висеть, читая вывод tail'а. Как только нужная строка (и еще одна после) будет получена, grep завершится, и выполнится команда.

micronekodesu ★★★
()
Ответ на: комментарий от micronekodesu

В попытке понимания сделал тест — grep не висит при отсутствии нужной строки, сразу выполняется command. Впрочем, как и при наличии нужной строки.

mexx
() автор топика
Ответ на: комментарий от mexx

Значит у вас последняя строка в файле и так искомая. Или вы в своем тесте что-то делаете не так - grep не может завершиться пока не найдет нужную строку, и так как он слушает stdin он будет ждать ее вечно. После того как искомый кусок подстроки будет найден - grep завершит выполнение, и выполнится ваша команда. Или же если вы убъете grep она тоже выполнится, но тогда можно точку с запятой заменить на &&.

micronekodesu ★★★
()
Ответ на: комментарий от mexx

Как это сделать в bash?


while true; do
        if ! read line; then
                sleep 1
        elif [[ $line = Status ]]; then
                command
                exit $?
        fi
done

Обратите внимание, «X$line» для bash не надо, это для обычного sh надо, где нет [[, а есть только [

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.