Найти несколько строк в файле и электронном письме в любой заданной строке - PullRequest
1 голос
/ 26 января 2012

Я хочу написать сценарий оболочки, который будет обнаруживать наличие нескольких строк, таких как «Ошибки | Уведомления | Предупреждения» из данного файла журнала, например / var / log / messages.Если какая-либо строка совпадает, она должна отправить почтовое уведомление на указанный почтовый идентификатор.

Я могу использовать:

grep -i -E '^Errors|Notice|Warnings' /var/log/messages

Но моя главная проблема в том, что файл журнала постоянно растет, и если я хочучтобы добавить этот сценарий в cron, как я могу записать строку файла или содержимое, которые я уже проверял при последнем выполнении моего сценария?

Например, если в файле журнала 100 строк и я прочиталфайл с помощью cat или чего-либо подобного, затем перед повторным выполнением файл становится 300 строками, а теперь я хочу прочитать число от 101 до 300.

Может кто-нибудь предложить, как я могу записать это?

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Вы можете использовать следующий скрипт для этого:

start=0

[[ -f last-processed ]] && start=$(<last-processed)

start=$((start+1))

tail +$start /var/log/messages | grep -i -E 'Errors|Notice|Warnings' &&\
wc -l /var/log/messages | awk '{print $1}' > last-processed

Кстати, у вас есть проблема в вашем regx, она должна быть 'Errors|Notice|Warnings' вместо '^Errors|Notice|Warnings'

1 голос
/ 26 января 2012

Поворот вашего файла журнала может быть лучшим решением.

Но если вы хотите выполнить grep файл от line_first до line_last, вы можете использовать sed:

Например, получить строку от 100 до 110 из входного потока:

$> line_first=100; line_last=110
$> seq 1 1000 | sed -n "${line_first},${line_last}p"
100
101
102
103
104
105
106
107
108
109
110
...