Как получить данные между датами в логе? Здравствуйте!
Есть файлApr 13 21:50:01 ec8a6c48b60d postfix/bounce[1613]: 8402DA417: sender non-delivery notification: A21ABA24B
Apr 13 21:50:01 ec8a6c48b60d postfix/qmgr[272]: A21ABA24B: from=<>, size=2466, nrcpt=1 (queue active)
Apr 13 21:50:01 ec8a6c48b60d postfix/qmgr[272]: 8402DA417: removed
Apr 13 21:50:01 ec8a6c48b60d postfix/smtp[1159]: A21ABA24B: to=, relay=none, delay=0.08, delays=0.05/0/0.03/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=0f61ac4703ba type=A: Host not found)
Apr 13 21:50:01 ec8a6c48b60d postfix/qmgr[272]: A21ABA24B: removed
Apr 13 21:50:02 ec8a6c48b60d postfix/pickup[1342]: C77C9A414: uid=0 from=
Apr 13 21:50:02 ec8a6c48b60d postfix/cleanup[1520]: C77C9A414: message-id=
Apr 13 21:50:02 ec8a6c48b60d opendkim[284]: C77C9A414: no signing table match for 'hidden@hidden.com'
Apr 13 21:50:02 ec8a6c48b60d opendkim[284]: C77C9A414: no signature data
Apr 13 21:50:02 ec8a6c48b60d postfix/qmgr[272]: C77C9A414: from=, size=1739, nrcpt=1 (queue active)
Apr 13 21:50:02 ec8a6c48b60d postfix/smtp[1385]: C77C9A414: to=, relay=none, delay=0.17, delays=0.15/0/0.03/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=0f61ac4703ba type=A: Host not found)
Apr 13 21:50:02 ec8a6c48b60d postfix/cleanup[1520]: E5F9BA24B: message-id=
Apr 13 21:50:02 ec8a6c48b60d postfix/bounce[1613]: C77C9A414: sender non-delivery notification: E5F9BA24B
Apr 13 21:50:02 ec8a6c48b60d postfix/qmgr[272]: E5F9BA24B: from=<>, size=3616, nrcpt=1 (queue active)
Apr 13 21:50:02 ec8a6c48b60d postfix/qmgr[272]: C77C9A414: removed
Apr 13 21:50:03 ec8a6c48b60d postfix/smtp[1159]: E5F9BA24B: to=, relay=none, delay=0.08, delays=0.06/0/0.03/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=0f61ac4703ba type=A: Host not found)
Apr 13 21:50:03 ec8a6c48b60d postfix/qmgr[272]: E5F9BA24B: removed
Apr 13 21:51:03 ec8a6c48b60d postfix/pickup[1342]: 79CCFA40F: uid=0 from=
Apr 13 21:51:03 ec8a6c48b60d postfix/cleanup[1520]: 79CCFA40F: message-id=
Apr 13 21:51:03 ec8a6c48b60d opendkim[284]: 79CCFA40F: no signing table match for 'hidden@hidden.com'
Apr 13 21:51:03 ec8a6c48b60d opendkim[284]: 79CCFA40F: no signature data
Apr 13 21:51:03 ec8a6c48b60d postfix/qmgr[272]: 79CCFA40F: from=, size=1739, nrcpt=1 (queue active)
Apr 13 21:51:03 ec8a6c48b60d postfix/smtp[1385]: 79CCFA40F: to=, relay=none, delay=0.24, delays=0.22/0/0.03/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=0f61ac4703ba type=A: Host not found)
Apr 13 21:51:03 ec8a6c48b60d postfix/cleanup[1520]: AAC1CA24B: message-id=
Apr 13 21:51:03 ec8a6c48b60d postfix/bounce[1613]: 79CCFA40F: sender non-delivery notification: AAC1CA24B
Apr 13 21:51:03 ec8a6c48b60d postfix/qmgr[272]: AAC1CA24B: from=<>, size=3616, nrcpt=1 (queue active)
Apr 13 21:51:03 ec8a6c48b60d postfix/qmgr[272]: 79CCFA40F: removed
Apr 13 21:51:03 ec8a6c48b60d postfix/smtp[1159]: AAC1CA24B: to=, relay=none, delay=0.13, delays=0.1/0/0.03/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=0f61ac4703ba type=A: Host not found)
Apr 13 21:51:03 ec8a6c48b60d postfix/qmgr[272]: AAC1CA24B: removed
Apr 13 21:52:03 ec8a6c48b60d postfix/pickup[1342]: 2A1F4A40F: uid=0 from=
Apr 13 21:52:03 ec8a6c48b60d postfix/cleanup[1520]: 2A1F4A40F: message-id=
Apr 13 21:52:03 ec8a6c48b60d opendkim[284]: 2A1F4A40F: no signing table match for 'hidden@hidden.com'
Apr 13 21:52:03 ec8a6c48b60d opendkim[284]: 2A1F4A40F: no signature data
Apr 13 21:52:03 ec8a6c48b60d postfix/qmgr[272]: 2A1F4A40F: from=, size=1739, nrcpt=1 (queue active)
Apr 13 21:52:03 ec8a6c48b60d postfix/smtp[1385]: 2A1F4A40F: to=, relay=none, delay=0.22, delays=0.2/0/0.03/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=0f61ac4703ba type=A: Host not found)
Apr 13 21:52:03 ec8a6c48b60d postfix/cleanup[1520]: 5309EA24B: message-id=
Apr 13 21:52:03 ec8a6c48b60d postfix/bounce[1613]: 2A1F4A40F: sender non-delivery notification: 5309EA24B
Apr 13 21:52:03 ec8a6c48b60d postfix/qmgr[272]: 5309EA24B: from=<>, size=3616, nrcpt=1 (queue active)
Apr 13 21:52:03 ec8a6c48b60d postfix/qmgr[272]: 2A1F4A40F: removed
Apr 13 21:52:03 ec8a6c48b60d postfix/smtp[1159]: 5309EA24B: to=, relay=none, delay=0.07, delays=0.04/0/0.03/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=0f61ac4703ba type=A: Host not found)
Размер его > 50мб
Как мне получить разрез данных в промежутке времени? Желательно быстро.
Разрез дат макисмум 10 дней
сейчас я поступаю следующим образом
1) grep -n -m 1 "Apr 10" если нет то прибавляю +1 день пока не дойду до ограничения в разрезе датcat mail.log | grep -n -m 1 "Jun 30"
2) grep -n -m 1 "Apr 10 10::[0-9]\{2\}:[0-9]\{2\}" если не нахожу данный час +1 час делаю и повторяю пока не дойду или не дойду до ограничения в конечном промежуткеcat mail.log | grep -n -m 1 "Jun 30 16:[0-9]\{2\}:[0-9]\{2\}"
3) в awk парсю полную дату начиная с последней строки где было совпадениеcat mail.log | tail -n +550376 | awk ' {
cmd = "date \"+%s\" -d \""$2" "$1" "2017" "$3"\"";
cmd | getline time;
if (time >= 1498829400) { print NR":"$0; exit 1 }
close(cmd);
}'
4) Если строка найдена то получаю ее номерcat mail.log | awk ' { if ($0 == "Jun 30 00:56:13 ec8a6c48b60d postfix/smtpd[3294]: connect from unknown[1.1.1.1]") print NR } '
выполняется в среднем на файле 72 бм 1-5 секунд
Это долго, учитывая что я только нашел верхний промежуток даты
Потом так же ищется нижний промежуток
И зная номера строк я могу вырезать этот кусок
На это в среднем уходит 15 секунд
Есть ли более адекватный алгоритм?
Спасибо

21 Авг 2019 в 06:27
201 +1
0
Ответы
1

Для более эффективного поиска данных между датами в логе, вы можете воспользоваться командой awk, чтобы выполнить фильтрацию на основе даты. Вот пример команды, которая найдет строки между двумя определенными датами:

cat mail.log | awk -v start="Apr 10 10:00:00" -v end="Apr 30 16:59:59" '$1 FS $2 FS $3 FS $4 FS $5 FS $6 >= start && $1 FS $2 FS $3 FS $4 FS $5 FS $6 <= end'

Эта команда сначала сравнивает полную дату и время каждой строки в логе с начальной и конечной датами, определенными в переменных start и end. Если строка удовлетворяет условию, она будет выведена.

Таким образом, вы можете избежать избыточных операций поиска и фильтрации, что поможет ускорить процесс обработки данных.

20 Апр в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир