Как получить данные между датами в логе? Здравствуйте!
Есть файл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
224 +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 Апр 2024 в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир