Я запускаю фоновый скрипт, который включает чтение файла журнала каждые 5 минут в таком формате

21:25:57 [INFO] event from 5 minutes ago
21:26:54 [INFO] potentially relevant event
21:28:26 [INFO] some event
21:30:06 [INFO] another event

За исключением того, что я хочу смотреть только на те строки, которые были напечатаны за последние 5 минут. По сути, мне нужно найти строку, в которой date -s "$logdate" +%s <= date -d "5 min ago" +%s ближе всего к концу файла, и игнорировать все строки перед ним.

К сожалению, в метках времени нет дат, поэтому это усложняет задачу, поскольку метки времени будут повторяться каждый день, если я не перезапущу сервер и не сброшу журнал (я бы предпочел этого не делать). Использование tac вместо cat может быть более эффективным, поскольку меня интересуют только строки, начинающиеся с конца файла.

0
specialkk 17 Авг 2014 в 10:06
Каков твой вопрос? С какой частью вам нужна помощь? Ваша идея tac многообещающая.
 – 
John Kugelman
17 Авг 2014 в 10:12

1 ответ

Лучший ответ

Если у вас есть дата GNU:

$ date +%T
04:56:32
$ date -d "5 min ago" +%T
04:51:45

И вы можете:

tac logfile | awk -v start=$(date -d "5 min ago" +%T) '$1 < start {exit} 1' | tac
1
glenn jackman 17 Авг 2014 в 12:59
Вау, это сработало отлично! Наверное, мне стоит познакомиться с awk больше, здесь он неплохо сработал.
 – 
specialkk
17 Авг 2014 в 19:01