Найти надежное решение, которое будет работать на 100% пуленепробиваемо, очень сложно, так как нам не хватает самой важной информации, год .
Представьте, что вам нужны последние 10 минут доступных данных 01 марта 2020 в 00: 05: 00 . Это немного раздражает, поскольку существует 29 февраля 2020 . Но в 2019 году это не так.
Я представляю здесь уродливое решение, которое рассматривает только третье поле (время), и сделаю следующие предположения:
- Лог-файл отсортирован по времени
- В каждый день есть как минимум один журнал!
В этих условиях мы можем отслеживать скользящее окно , начиная с первого доступного времени.
Если вы сохраните следующее в файле extractLastLog.awk
{ t=substr($3,1,2)*3600 + substr($3,4,2)*60 + substr($3,7,2) + offset}
(t < to) { t+=86400; offset+=86400 }
{ to = t }
(NR==1) { startTime = t; startIndex = NR }
{ a[NR]=$0; b[NR]=t }
{ while ( startTime+timeSpan*60 <= t ) {
delete a[startIndex]
delete b[startIndex]
startIndex++; startTime=b[startIndex]
}
}
END { for(i=startIndex; i<=NR; ++i) print a[i] }
, затем вы можете извлечь последние 23 минуты следующим образом:
awk -f extractLastLog.awk -v timeSpan=23 logfile.log
Второе условие, которое я дал ( Существует хотя бы один журнал каждый день! ), необходимо, чтобы результаты не испортились. В приведенном выше коде я вычисляю время довольно просто, HH*3600 + MM*60 + SS + offset
. Но я утверждаю, что если текущее время меньше предыдущего, это означает, что мы находимся в другой день, поэтому мы обновляем смещение на 86400 секунд. Так что если у вас есть две записи, такие как:
Jan 09 12:01:02 xxx
Jan 10 12:01:01 xxx
это будет работать, но это
Jan 09 12:01:00 xxx
Jan 10 12:01:01 xxx
не будет работать. Он не осознает, что день изменился. Другие случаи, которые потерпят неудачу:
Jan 08 12:01:02 xxx
Jan 10 12:01:01 xxx
поскольку он не знает, что прыгнул два дня. Исправления для этого не легко из-за месяцев (все благодаря високосным годам).
Как я уже сказал, это ужасно, но может сработать.