Отображение строк за последние 10 минут с определенным шаблоном в журналах

Отображение строк за последние 10 минут с определенным шаблоном в журналах

Мне нужно отобразить строки с ошибками, произошедшими за последние 10 минут в файле журнала.

Aug 26 10:50:42 Normal line.
Aug 26 10:51:23 Normal line.
Aug 26 10:55:33 Error line.
Aug 26 10:56:45 Normal line.
Aug 26 10:58:12 Error line.
Aug 26 11:02:31 Normal line.
Aug 26 11:03:32 Normal line.
Aug 26 11:04:11 Normal line.

Предположим, что вышеприведенный пример файла журнала. Я хочу отобразить только следующие две строки

Aug 26 10:55:33 Error line.
Aug 26 10:58:12 Error line.

Я использую AIX.

решение1

С благодарностью Стефану Шазеласу за два его ответа:

Я предлагаю решение методом грубой силы, которое перебирает все возможные записи временных меток за последние 10 минут:

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%(%b %d %H:%M:%S)T\n' "$i seconds ago")
  grep "^${d} Error" logfile
done

Это грубая сила, потому что она вызывает grep(и printf, встроенную) 601 раз. Для этого требуется ksh93, который поддерживает %Tопцию printf для печати (и форматирования) произвольных временных меток. Однако это проще, чем выполнять вычисления с датами самостоятельно, из-за таких пограничных случаев, как:

  • границы дня
  • границы месяца
  • возможные изменения в связи с переходом на летнее время

решение2

Здесь есть возможность, бесстыдно скопировав решение @Jeff Schaller. Один вызов grep, так что, возможно, немного быстрее.

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%s|%(%b %d %H:%M:%S)T' "${d}" "${i} seconds ago")
done
grep -E "^(${d:1}) Error" logfile

решение3

Спасибо за все ваши ответы, я выполнил необходимую работу с помощью следующей команды.

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' logfile

где d1 и d2 были инициализированы выше. Сделал работу за меня.

Ваше здоровье.

решение4

Если вам нужно получать последние 10 минут каждые 10 минут, вы можете использоватьвырезатьлогинструмент, который позволяет распечатать невидимую хвостовую часть файла журнала. Сначала вы сохраняете позицию файла командой

$ cutthelog logfile > /dev/null

затем обработайте журнал с помощью задания cron, например

*/10 * * * * root cutthelog logfile | grep 'Error line' | ..."

В качестве дополнительного преимущества вам не придется читать весь журнал при каждой проверке.

Связанный контент