Необходимо использовать регулярное выражение в следующем запросе:
SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__
Однако статью в документации с использованием регулярных выражений я никак не осилю. Может подскажет кто?!
>Необходимо использовать регулярное выражение в следующем запросе:
>SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__А что за регулярное выражение, если не секрет? Другим способом никак нельзя?
>>Необходимо использовать регулярное выражение в следующем запросе:
>>SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__
>
>А что за регулярное выражение, если не секрет? Другим способом никак нельзя?
>Регулярное выражение: ^(http://[^/]+)/.*|\1
Это лог сквида в базе, и я хочу подсчитать кол-во посещений того или иного сайта. Другой способ если и есть, то слишком гемморойный.
>>>Необходимо использовать регулярное выражение в следующем запросе:
>>>SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__
>>
>>А что за регулярное выражение, если не секрет? Другим способом никак нельзя?
>>
>
>Регулярное выражение: ^(http://[^/]+)/.*|\1
>Это лог сквида в базе, и я хочу подсчитать кол-во посещений того
>или иного сайта. Другой способ если и есть, то слишком гемморойный.
>мда ... запихивать текстовые логи в базу, а потом думать как их обработать - это истинный путь самурая
>мда ... запихивать текстовые логи в базу, а потом думать как их
>обработать - это истинный путь самураяДело не в том "ЗАЧЕМ", а в том "КАК". Будьте уверены, причина была.
>>мда ... запихивать текстовые логи в базу, а потом думать как их
>>обработать - это истинный путь самурая
>
>Дело не в том "ЗАЧЕМ", а в том "КАК". Будьте уверены, причина
>была.можен причина и была но мне совершенно не понятен смысл выражения
GROUP BY __регулярное выражение__уж разбери тогда данные в самом запросе по простым полям, а потом уже групируй
>можен причина и была но мне совершенно не понятен смысл выражения
>GROUP BY __регулярное выражение__Это кол-во посещений того или иного сайта. Обычно в логах URL имеет вид http://domain.ru/path/bla-bla-bla/ Но группировать по этому полю нельзя. Поэтому я хочу регулярным выражением сначала обрезать URL до вида http://domain.ru, а потом выполнить группировку. Обработка через перл для IP 22-й сети занимает около 10-15 минут, поэтому этот вариант неприемлем. Гораздо эффективнее написать SQL запрос, чтобы MySQL сам все обрабатывал.
>>можен причина и была но мне совершенно не понятен смысл выражения
>>GROUP BY __регулярное выражение__
>
>Это кол-во посещений того или иного сайта. Обычно в логах URL имеет
>вид http://domain.ru/path/bla-bla-bla/ Но группировать по этому полю нельзя. Поэтому я хочу
>регулярным выражением сначала обрезать URL до вида http://domain.ru, а потом выполнить
>группировку. Обработка через перл для IP 22-й сети занимает около 10-15
>минут, поэтому этот вариант неприемлем. Гораздо эффективнее написать SQL запрос, чтобы
>MySQL сам все обрабатывал.спасибо поржал, очень смешно ... ))
во-первых: для обрезки строк надо использовать функции работы со строкой (подстрокой), но никак не регексы
во-вторых: ты видимо не знаешь что такое регексы ибо начинаешь рассуждать еще про какието скорости )) обработка регекса это уже слишком тяжело ибо обрабатывается он совсем не так как ты это себе представляешь
во-третих: ты считаешь что читать текстовый файл напрямую с диска медленне чем делать запрос в мускуле?
в-четвертых: а в мускуле вообще случайно не PCRE используется?
>во-первых: для обрезки строк надо использовать функции работы со строкой (подстрокой), но
>никак не регексыПочему же я не могу при помощи регулярных выражений отрезать часть URL?
>во-вторых: ты видимо не знаешь что такое регексы ибо начинаешь рассуждать еще
>про какието скорости )) обработка регекса это уже слишком тяжело ибо
>обрабатывается он совсем не так как ты это себе представляешьЯ говорю не про скорость работы регулярных выражений, а про кол-во запросов. Если я буду делать все через Perl, это потребует организации нескольких запросов к базе, точней несколько сотен, с учетом еще и цикла по IP. А таблица там ого-го, 1,5 млн записей только за день.
>во-третих: ты считаешь что читать текстовый файл напрямую с диска медленне чем
>делать запрос в мускуле?Нет, не считаю, но мне удобнее хранить данные именно в базе.
>в-четвертых: а в мускуле вообще случайно не PCRE используется?
Честно говоря, не знаю.
>>во-первых: для обрезки строк надо использовать функции работы со строкой (подстрокой), но
>>никак не регексы
>
>Почему же я не могу при помощи регулярных выражений отрезать часть URL?ну если уж полез через жопу, дак лезь тогда глубже )
мне вот чета влом
>>во-вторых: ты видимо не знаешь что такое регексы ибо начинаешь рассуждать еще
>>про какието скорости )) обработка регекса это уже слишком тяжело ибо
>>обрабатывается он совсем не так как ты это себе представляешь
>
>Я говорю не про скорость работы регулярных выражений, а про кол-во запросов.
>Если я буду делать все через Perl, это потребует организации нескольких
>запросов к базе, точней несколько сотен, с учетом еще и цикла
>по IP. А таблица там ого-го, 1,5 млн записей только за
>день.я не предлагал связку perl-mysql, я предлагал perl-file
>>во-третих: ты считаешь что читать текстовый файл напрямую с диска медленне чем
>>делать запрос в мускуле?
>
>Нет, не считаю, но мне удобнее хранить данные именно в базе.не ну это собстна твоя проблема ) как показала твоя же практика и именно тебе - нихрена не удобнее ))
>>в-четвертых: а в мускуле вообще случайно не PCRE используется?
>
>Честно говоря, не знаю.вообще по уму ты бы задачу нормально изложил и свое решение, а не открывал бы топ какимто кривым запросом, ни кому не понятным
Спасибо. Я уже понял, что с помощью регулярных выражений в SQL мою задачу не решить. MySQL не осуществляет подстановку через регулярку, а лишь может возвращать значение истину или ложь, в зависимости от того, совпадает поле с регулярным выражением или нет. К сожалению, мне нужна была именно замена и именно с GROUP BY. Придется решать другим путем.К сожалению, нормально эта тема изложена только на http://dev.mysql.com/doc/refman/5.0/en/regexp.html, пока не добрался туда, не понял.
>Я говорю не про скорость работы регулярных выражений, а про кол-во запросов.
>Если я буду делать все через Perl, это потребует организации нескольких
>запросов к базе, точней несколько сотен, с учетом еще и цикла
>по IP. А таблица там ого-го, 1,5 млн записей только за
>день.Интересно думают непрограммисты, расскажи пожалуйста зачем тебе несколько сотен запросов на perl. Как по мне для этой задачи нужен всего один запрос, мог бы даже набросать пример, но любопытно сначала узнать как ты решил эту задачу.
Добавь ещё одну колонку в таблицу, где храни название сайта. Да, денормализация. Но зато и ускорение.
google.ru + mysql group by regexp + ENTER Наслаждайтесь! Пока бесплатно.......И нет, не помогает. 8-O
Нету там, судя по диаголальному взгляду, _замены_ по регэкспу. Так что -- GROUP BY + много-много SUBSTRING_INDEX(SUBSTRING_INDEX(url,... =парсить вручную.
+ Типа, RTFM-
http://dev.mysql.com/doc/refman/5.1/en/string-functions.html.....?
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(url,'://',':'),'/','?'),'?',1),':',-1)И нет, SQL-я не знаю и не пользую.
---Бейсик, Rexx -- обязательная часть обучения. После семи лет выноса пробивок от перфокарт. Ученики Волшебника - парсят html.
А в awk возможна ли замена по regex? То есть, если я заношу данные черезcat /var/log/squid/access.log.0 | awk '{print "INSERT INTO access (ip,bytes,link,trans,time) VALUES(\""$3"\",\""$5"\",\""$7"\",\""$9"\",from_unixtime("$1"));"};'| mysql -D squid -u squid
Могу ли я на этом этапе обрезать адреса? Что-то типа:
cat /var/log/squid/access.log.0 | awk '{$3,$5,$7 ~ |^(http://[^/]+)/.*|\1|,$9}'
>А в awk возможна ли замена по regex?Да: sub(), gsub()
>А в awk возможна ли замена по regex?
>cat /var/log/squid/access.log.0 | awk '{$3,$5,$7 ~ |^(http://[^/]+)/.*|\1|,$9}'Не-а. Ж) Только порезать на части (если я правильно понял про $9):
| gawk 'BEGIN{split("3 5 7",idx)}{for (fld in idx) if( match($fld,"^([a-z]+://)?([^/]+)",ss) >0) $fld=ss[2]; print $3" "$5" "$7" "$9}'
| gawk 'function host(url, ss){if( match(url,"^([a-z]+://)?([^/]+)",ss) >0) return ss[2]; return url;} {print host($3)" "host($5)" "host($7)" "$9}'
От тех же самых substr+index match "спасает", но замена - практически на том же уровне.
+Если "повезёт" с версией _GNU_ awk-а. Кажется в районе 3.1.2 чего-то чинили в match().
---И да, чего только люди не делают, чтоб не учиться перлу. %)
Не про $9, а про $7. Примерно так: http://www.opennet.me/openforum/vsluhforumID9/8354.htmlУбица мокрым веником, шоб я так жил, как вы пишете такие сложности. Кстати, глянул sub и gsub. Даже попробовал:
awk 'BEGIN {
str = "http://domain.ru/images/hotels/villa.jpeg"
sub(/^(http:\/\/[^\/]+)\/.*/, "\1", str)
print str
}'
Почти все работает, кроме "\1". Не хочет распознавать эту подмену. Скорее всего потому что FreeBSD.Просто не люблю Perl.
>Убица мокрым веником, шоб я так жил, как вы пишете такие сложности.:-))
>Кстати, глянул sub и gsub. Даже попробовал:
>awk 'BEGIN {
>Почти все работает, кроме "\1". Не хочет распознавать эту подмену. Скорее всегоЕсли долго смотреть на man gawk, то можно заметить, что \1 есть только в gensub, а в sub/gsub есть только "&"... Кроме того сама gensub() -- "расширение GNU".
>потому что FreeBSD.
...веником - опять позиксвей. :-> http:/openforum/vsluhforumID9/8367.html#9
>Необходимо использовать регулярное выражение в следующем запросе:
>SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__
>Однако статью в документации с использованием регулярных выражений я никак не осилю.
>Может подскажет кто?!Если domain всегда начинается с http://
SELECT SUBSTRING_INDEX( SUBSTRING( ref, 8 ) , '/', 1 ) AS domain, COUNT( * ) AS c FROM access GROUP BY SUBSTRING_INDEX( SUBSTRING( ref, 8 ) , '/', 1 ) ORDER BY c DESC