Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск интервала времени регулярными выражениями  (Прочитано 15431 раз)
0 Пользователей и 1 Гость смотрят эту тему.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« : 25-10-2010 08:28 » new

Задача: из файла с логами на удаленном сервере быстро выцепить записи за указанный интервал времени
Формат файла (файлы организуются посуточно):
датавремя:всякаяхрень

на входе задачи - интервал времени дата1-дата2. Нужно выбрать все строки из файла после дата1 но до дата2.
Проблем несколько:
* дата1 и дата2 могут явно не присутствовать в файлах (то есть, заданного 12:20:08 нет, но 12:20:11 уже есть)
* строки могут вообще не содержать даты (тогда нужно считать, что они относятся к предыдущей дате)
* логи лежат на удаленном сервере и желательно обрабатывать это все там. Соединение будет устанавливаться через SSH, на сервере стоит либо w2k3/Cygwin, либо RedHat (пока для RH задачу пропустим, но перспектива есть)
* идея внедрить на сервер приложение или скрипт, а затем выполинть мне нравится в меньшей степени, чем идея выполнить одну, пусть даже большую составную команду.
* опыта с *nix-системами у меня довольно мало и среди всех команд я ориентируюсь плохо

Раньше похожую задачу я решал через grep/sed (парсил конфиги), этих инструментов хватало... В принципе, можно через grep попробовать реализовать и эту задачу, но проблема с непрерывностью дат меня смущает - как задать диапазон через регулярное выражение?

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

Прошу подсказать - у кого какие мысли - в каком направлении двигаться?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 25-10-2010 08:58 » 

Я бы выбрал perl и дешево и сердито Улыбаюсь Его можно поставить и на вин сервер. А в RH он по умолчанию стоит. Да и скрипт будет практически транспортабелен на две системы. Единственное что придется менять, это пути к логам.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #2 : 25-10-2010 09:35 » 

Я бы выбрал perl и дешево и сердито Улыбаюсь Его можно поставить и на вин сервер.
Finch, ставить что-то - это не вариант. Уже есть несколько десятков серверов, они настроены, работают и пишут логи.
Максимум что можно "поставить" - это скопировать скрипт, например, на bash и выполнить его.
Сейчас спешно изучаю bash по гуглу Улыбаюсь

Хочется простое решение, способное быстро обработать несколько полуторагиговых логов, не сильно влияя на работу сервера (не отнимая CPU и память на лишние операции).
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 25-10-2010 09:40 » 

в любом случае нужно открывать файл логов и обрабатывать построчно
Регулярные выражения? Может на малом объеме это и реально.

А чем не нравится awk? (yt nfr cnhfity xthn rfr tuj vfk..n) Улыбаюсь

Что дальше собираешься делать с результатом?
Сохранять?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 25-10-2010 10:04 » 

baldr, Bash под винду?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #5 : 25-10-2010 10:07 » 

Finch, да, через cygwin - он уже установлен.

Sla, против awk ничего не имею, но в глаза его не видел - поэтому и хочу получить рекомендации прежде чем тратить кучу времени на попытки.. Улыбаюсь
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #6 : 25-10-2010 10:09 » 

Что дальше собираешься делать с результатом?
Сохранять?
да, сохранять в файл, паковать и копировать куда-то.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 25-10-2010 10:12 » 

Ну в одном скрипте awk можно уместить почти всю задачу Улыбаюсь Если хочеш, могу скинуть книжку, там довольно подробно описано, как делать скрипты.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #8 : 25-10-2010 10:23 » 

Finch, выложи куда-нибудь? Посмотрю что получится..
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 25-10-2010 10:35 » 

http://depositfiles.com/files/vqbfqii1j Ссылка не знаю, сколько будет жить. Но думаю максимум месяц.

Добавлено через 7 минут и 3 секунды:
На 84 странице книги как раз идет описание awk. Все содержание в самом конце.
« Последнее редактирование: 25-10-2010 10:42 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #10 : 25-10-2010 10:59 » 

Finch, спасибо, посмотрю.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 25-10-2010 15:15 » 

https://club.shelek.ru/viewfiles.php?id=45
Тут книга по регулярным выражениям - есть и PCRE, и выражения awk.

Awk - язык для написания текстовых фильтров. Синтаксис awk примитивен и напоминает shell (sh, bash). Описание языка awk вполне укладывается в man. Строится блоками. Каждый блок предваряется условием, которое проверяется для каждой строки входного потока. Также есть специальные блоки типа BEGIN и END.
Все, что есть в awk, есть и в Perl. Но Perl намного мощнее и по производительности на два порядка быстрее awk (проверял на практике). Кстати, поставить ActivePerl также легко, как любое win-приложение. Он тоже бесплатный.

В обеих языках фильтр для данного случая строится одинаково:

Вариант 1:
1. Выделяем часть строки с датой и проверяем на вхождение в диапазон: выводим или нет.

Вариант 2:
1. Если флаг не установлен, проверяем на начало блока: устанавливаем флаг и выводим строку.
2. Если флаг установлен, проверяем выход за границу диапазона: снимаем флаг.
3. Флаг установлен: выводим строку.

Для данного случая проще вариант 1. Вариант 2 универсальный, т.к. позволяет работать не только с датами, но и с любыми маркерами.
« Последнее редактирование: 25-10-2010 15:24 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #12 : 26-10-2010 08:41 » 

Всем спасибо, задача решена. Perl был, оказывается, уже установлен, коллега помог со скриптом - все работает.
RXL, алгоритм был понятен, конечно, но спасибо Улыбаюсь
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 26-10-2010 09:48 » 

я делал так
Код:
awk -v date1=somedate -v date2=somedate -v FS="\t" ' $1 > date1 && $1 < date2  { print $0; }'
правда в логах были даты в виде который позволял сравнивать как числа или строковые литералы
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines