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

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

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

  • Регулярные выражения внутри строки в AWK, используя if / then структуру управления?
  • Объединить 2 файла на основе всех значений первого столбца первого файла
  • Объединение совпадающих столбцов с двумя файлами или использование значения по умолчанию
  • Как сохранить сложное регулярное выражение для многократного повторного использования в sed?
  • Как извлечь первый код base64 из файла?
  • Как удалить все пробелы между скобками с помощью bash?
  • <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 минут?

  • Как использовать + в регулярном выражении в sed?
  • Проблема печати Awk
  • Как преобразовать поля фиксированной длины в файл в пространство с разделителями
  • Загрузка модуля CPAN не выполняется
  • perl + uniq перед переменной
  • sed, как заменить, когда в строке есть «http: //»?
  • 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 - лучшая ОС в мире.