![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Danger |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Hello,
Access.log моего squid-a имеет такой формат:
Т.е., записи выглядят примерно так:
Проблема состоит в том, чтобы выделить из таких записей данные, по шаблону. Т.е. выделить каждый элемент (timestamp, url, method, useragent, etc..) из строки. split() для этого случая не годится, т.к. элементы в строке разделены пробелами и сами элементы могут быть ограничены кавычками (внутри кавычек могут пробелы встречаться). Подскажите, как составить регулярку для этого случая? Или какой-нибудь другой вариант решения. |
||||
|
|||||
| GoDleSS |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: 2 Всего: 2 |
Парсите шаблоном напрямую, вот пример(естественно не проверенный, ибо лень):
--------------------
It's a nice day to die my friend! |
|||
|
||||
| Danger |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Пробовал по вышеприведенному примеру, вот что получилось (с учетом того, что все нужные мне параметры находятся по порядку):
Со включенными варнингами пишет, что значения не были инициализированы, примерно так:
Я не разбираюсь регулярках, мне нужно лишь сделать, чтоб работал разбор для этого случая. Если не составит труда, подскажите точный шаблон... Буду очень признателен. |
||||
|
|||||
| GoDleSS |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: 2 Всего: 2 |
--------------------
It's a nice day to die my friend! |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Danger, предлагаю другой вариант: выберите в качестве разделителя полей другой символ (или группу символов, вместо пробела), которого точно не будет внутри значений, тогда split сработает без проблем.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Danger |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Работает замечательно, за исключением интерпретации первого значения в строке: выделяется лишь часть до точки, значение после точки игнорируется (например, в исходной строке было 970313965.619, выделится лишь 970313965). Все остальные отрабатывают корректно. Что нужно подправить в шаблоне, чтобы первое значение тоже бралось корректно? Спасибо. Добавлено через 3 минуты и 42 секунды
Я думал над этим вариантом ранее, но хотелось более красивое решение, коим сейчас видится предложенное GoDleSS. Изящное решение на основе произвольного шаблона (причем остается потенциальная совместимость с другими анализаторами логов, с случае с "нетрадиционным" разделителем может и не быть). |
||||||
|
|||||||
| GoDleSS |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: 2 Всего: 2 |
заменить на
Всего лишь обратите внимание на разницу, а разница в положении закрывающей скобки, соответствующей выборке $1 или в данном подходе $data[0] Это сообщение отредактировал(а) GoDleSS - 3.7.2008, 19:11 --------------------
It's a nice day to die my friend! |
||||
|
|||||
| Danger |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Большое спасибо, все работает. С небольшой лишь поправкой, для моего случая:
Это сообщение отредактировал(а) Danger - 4.7.2008, 05:32 |
||||
|
|||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
grep { $_ ne "" } split /(?:\s+"(.+?)"\s+|\s+)/,
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |