Найти - Пользователи
Полная версия: как определить принадлежит ли IP адрес подсети
Начало » Python для новичков » как определить принадлежит ли IP адрес подсети
1 2
Юрчек
Вот встала такая задача, есть лог,
1239739203	192.168.69.226	43652	195.20.224.156	53	57	
1239739203 192.168.70.114 64732 74.196.166.114 35837 134
1239739203 192.168.70.110 5195 117.13.15.157 16001 134
1239739203 192.168.70.90 18231 91.204.68.1 53 72
1239739203 192.168.171.110 1711 94.100.177.6 110 502
длиной в пару гигов
и мне надо из него вытащить все адреса принадлежащие одной подсети (второй столбик)
пока решаю с помощью регэкспов, но на больших объемах данных, это очень медленно, да и неудобный регэксп получается, если например маска подсети /30 или /29
onet = re.compile('192\.168\.70\.')
for line in logfile:
oip = line.split()[1]
if onet.match(oip):
file.write(line)
Наверняка кем то уже написана библиотека для работы с IP адресами, только вот я ее никак не могу найти.
PooH
есть Ipy
Но регэкспом значительно быстрее, лучше напишите функцию которая генерит регэксп по подсетке.

ЗЫ: есть еще
IPlib
ipaddr-py, но все равно в вашем случае регэксп самый быстрый вариант
Ferroman
Думаю можно засунуть лог в базу и выгребать нужное с помощью sql like. Только это хороший вариант если в одном и том же логе нужно искать разные маски. Тогда самая длинная процедура будет засовывание всего в базу.
PooH
Ferroman
Думаю можно засунуть лог в базу и выгребать нужное с помощью sql like. Только это хороший вариант если в одном и том же логе нужно искать разные маски. Тогда самая длинная процедура будет засовывание всего в базу.
like не использует индексы. если засовывать в базу, тогда уж лучше переводить ip в число и искать накладывая маску, а постгресе есть и нативный тип для ip и проверка на принадлежность к подсети.
in.codee
А если так?

logfile = open('log.txt', 'r')
result = []
subnet = '192.168.69.226'

for i in logfile.readline():
i = i.strip()
n = i.split()
if n[1] == subnet:
result.append(i)
Правда не в курсе насколько это быстрее :) Первое, что в голову пришло.
pythonwin
in.codee
Правда не в курсе насколько это быстрее smile Первое, что в голову пришло.
лучше использовать COPY в потгрессе
COPY table_name FROM filename;
раздница в скорости будет на 2-3 порядка, по сравнению с чтением и парсировкой логов в питоне
PS in.codee, это случаем не логи ulog?
pythonwin
документация на COPY
http://www.postgresql.org/docs/8.3/interactive/sql-copy.html
Ferroman
PooH
Да, как вариант.
sypper-pit
def grep(string,list):
import re
expr = re.compile(string)
for text in list:
match = expr.search(text)
if match != None:
return match.string
а дальше
grep("192.168.70",re.split("\n", open(r'log.txt').readlines())))
я думаю кк то так
ofigetitelno
:)
Питон - это конечно хорошо…
Но иногда нужно смотреть и по сторонам…
http://www.lexa.ru/programs/grepip.html
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB