Как получить журналы между двумя диапазонами дат в Unix - PullRequest
0 голосов
/ 28 июня 2019

У меня есть файл журнала abc.log, в котором каждая строка представляет собой дату в формате date +%m%d%y:

061019:12
062219:34
062319:56
062719:78

Я хочу просмотреть все журналы между этим диапазоном дат (за 7 дней до даты и до текущей даты), т.е. (с 062019 по 062719 в данном случае). Результат должен быть:

062219:34
062319:56
062719:78

Я попробовал несколько вещей с моей стороны, чтобы достичь:

awk '/062019/,/062719' abc.log

Это дает мне правильный ответ, но если я не хочу жестко задавать значение даты и пытаться получить то же самое, это не дает правильного значения.

awk '/date --date "7 days ago" +%m%d%y/,/date +%m%d%y' abc.log

Примечание:

  • date --date "7 days ago" +%m%d%y & rarr; 062019 (7 дней назад)
  • date +%m%d%y062719 (текущая дата)

Есть предложения, как этого достичь?

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Чтобы обойти проблему поиска дат, которых может не быть, вы можете сгенерировать шаблон, который соответствует любой из дат (поскольку их всего 8, он не становится слишком большим, если вы хотите посмотретьза последний год это может не сработать):

for d in 7 6 5 4 3 2 1 0
do
  pattern="${pattern:+${pattern}\\|}$(date --date "${d} days ago" +%m%d%y)"
done

grep "^\\(${pattern}\\)" abc.log
0 голосов
/ 28 июня 2019

Ваш средне-порядковый формат даты не подходит для сортировки и сравнения.Y-m-d было бы намного проще.

Ваш подход с использованием , диапазонов в awk требует ровно одной записи в день (и что записи журнала сортируются в хронологическом порядке).

Я быиспользуйте perl, например что-то вроде:

perl -MPOSIX=strftime -ne '
    BEGIN { ($start, $end) = map strftime("%y%m%d", localtime $_), time - 60 * 60 * 24 * 7, time }
    print if /^(\d\d)(\d\d)(\d\d):/ && "$3$1$2" ge $start && "$3$1$2" le $end' abc.log
  1. Используйте strftime "%y%m%d", чтобы получить концы диапазона дат в формате с прямым порядком байтов (что позволяет проводить лексикографические сравнения).
  2. Используйте регулярное выражение для извлечения дня / месяца / года из каждой строки в отдельные переменные.
  3. Сравните перестроенные поля даты текущей строки с окончаниями диапазона, чтобы определить, печатать ли строку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...