Запись файлов grep за последние 30 минут

Я создаю сценарий, который будет отправлять сообщения об ошибках / предупреждения из журнала. Я хотел бы, чтобы это отправлялось каждые полчаса, но я хочу отправить его только в том случае, если есть новая запись. Как бы я проглотил только последние полчаса ошибок?

Метка времени в журнале имеет следующий формат.

<1 августа 2016 года 2:15:29 PM MDT> <Сведения об ошибке …..>

Скрипт пока:

#!/bin/bash cat /var/log/logfile.log | egrep -i "error|warning" | tee -a /tmp/log.tmp "get only last 30 min of errors" | mail -s "Errors/Warning" user@email.com 

Можно ли преобразовать отметки времени (1 августа 2016 года 2:15:29 PM MDT) в эпоху, затем сравнить ее с текущей эпохой или есть ли способ с sed / awk / perl получить последние 30 минут?

  • Как удалить все числа, окруженные <>
  • BSD sed: заменить только N-е вхождение шаблона
  • нужна помощь с awk, объединяющим строки по последовательности из нескольких файлов в один файл
  • «Sed» переписать файл для отображения целых чисел и удалить оставшиеся символы
  • Использование sed для замены кода javascript в нескольких файлах
  • Поиск шаблона между определенными линиями и номерами строк печати
  • Создание файлов из шаблонов, замещение в середине других слов
  • grep: отображать имя файла один раз, затем отображать контекст с номерами строк
  • 3 Solutions collect form web for “Запись файлов grep за последние 30 минут”

    Для перехода в эпоху вы можете использовать следующую инструкцию:

     # date +%s -d"Aug 1, 2016 2:15:29 PM MDT" 1470082529 

    Для конвертируемой эпохи в UTC вы можете использовать:

     # date -d @1470082529 Tue Aug 2 00:45:29 IRDT 2016 #### on Linux Box # date -r 1470082529 Tue Aug 2 00:45:29 IRDT 2016 ###on BSD box 

    Я бы использовал perlFile::Tail . У меня нет времени, чтобы написать пример сейчас, но в perlish псевдокоде он будет выглядеть примерно так:

     #! /usr/bin/not-actually-perl use strict; use File::Tail; use Net::SMTP or Mail::Mailer or one of the squillion other perl mail sending modules; open a File::Tail file handle to your log file my $now=time(); my @lines = (); while (read the File::Tail handle) { push @lines, $_; if (time() > ($now + 1800 seconds) ) { $now=time(); email the @lines array to you@your.address; @lines=(); } } на #! /usr/bin/not-actually-perl use strict; use File::Tail; use Net::SMTP or Mail::Mailer or one of the squillion other perl mail sending modules; open a File::Tail file handle to your log file my $now=time(); my @lines = (); while (read the File::Tail handle) { push @lines, $_; if (time() > ($now + 1800 seconds) ) { $now=time(); email the @lines array to you@your.address; @lines=(); } } в #! /usr/bin/not-actually-perl use strict; use File::Tail; use Net::SMTP or Mail::Mailer or one of the squillion other perl mail sending modules; open a File::Tail file handle to your log file my $now=time(); my @lines = (); while (read the File::Tail handle) { push @lines, $_; if (time() > ($now + 1800 seconds) ) { $now=time(); email the @lines array to you@your.address; @lines=(); } } 

    Фактический рабочий сценарий, вероятно, будет меньше, чем на 10 строк дольше, чем указано выше, и большая часть из них будет настраивать заголовки для электронной почты.

    и еще несколько строк, чтобы поймать различные сигналы, чтобы отправить по электронной почте то, что у него есть в @lines, перед тем, как приостановить или выйти из игры.

    См. Справочные страницы для File::Tail и Net::SMTP (или что-то еще) для получения точных сведений.

    Отличные идеи, самое простое предложение @MelBurslan для разграничения файлов.

     #!/bin/sh MAILTO=user@email.com OFILE=/var/tmp/alerts.tmp LOG30=/var/tmp/LOG30 LOGNOW=/var/tmp/LOGNOW HOST=`hostname` # setup file if [ -f ${OFILE} ]; then cat /dev/null > ${OFILE} else touch ${OFILE} fi cat /var/log/logfile.log | egrep -i "error|warning" | tee -a ${LOGNOW} diff ${LOG30} ${LOGNOW} | tee -a ${OFILE} if [ -f ${OFILE} ]; then echo "Errors" | cat - ${OFILE} > temp && mv temp ${OFILE} mailx -r root@server.com -s "Errors" ${MAILTO} < ${OFILE} fi rm ${LOG30} mv ${LOGNOW} /var/tmp/LOG30 rm ${OFILE} 
    Linux и Unix - лучшая ОС в мире.