Как узнать, сколько раз конкретный ip появляется в лог-файле? - PullRequest
0 голосов
/ 12 марта 2012

У меня есть сценарий Python, который извлекает уникальные IP-адреса из файла журнала и отображает их количество попыток проверки этих IP-адресов следующим образом.

 import sys

 def extract_ip(line):
     return line.split()[0]

 def increase_count(ip_dict, ip_addr):
     if ip_addr in ip_dict:
        ip_dict[ip_addr] += 1
     else:
        ip_dict[ip_addr] = 1

 def read_ips(infilename):
     res_dict = {}
     log_file = file(infilename)
     for line in log_file:
         if line.isspace():
            continue
         ip_addr = extract_ip(line)
         increase_count(res_dict, ip_addr)
     return res_dict

 def write_ips(outfilename, ip_dict):
     out_file = file(outfilename, "w")
     for ip_addr, count in ip_dict.iteritems():
         out_file.write("%5d\t%s\n" % (count, ip_addr))
     out_file.close()

 def parse_cmd_line_args():
     if len(sys.argv)!=3:
         print("Usage: %s [infilename] [outfilename]" % sys.argv[0])
         sys.exit(1)
     return sys.argv[1], sys.argv[2]

 def main():
     infilename, outfilename = parse_cmd_line_args()
     ip_dict = read_ips(infilename)
     write_ips(outfilename, ip_dict)

 if __name__ == "__main__":
     main()

Я хочу добавить функциональность в код, чтобы при передаче определенного URL-адреса он возвращал количество обращений к URL-адресу с каких IP-адресов.

например. если я передам URL в качестве ввода: http://www.epicbrowser.com/hrefadd.xml

вывод должен быть в следующем формате

10.10.128.134        4
10.134. 222.232      6

Файл журнала имеет следующий формат с 24k строками.

220.227.40.118 - - [06/Mar/2012:00:00:00 -0800] "GET /mysidebars/newtab.html HTTP/1.1" 404 0 - -
220.227.40.118 - - [06/Mar/2012:00:00:00 -0800] "GET /hrefadd.xml HTTP/1.1" 204 214 - -
59.95.13.217 - - [06/Mar/2012:00:00:00 -0800] "GET /dbupdates2.xml HTTP/1.1" 404 0 - -
111.92.9.222 - - [06/Mar/2012:00:00:00 -0800] "GET /mysidebars/newtab.html HTTP/1.1" 404 0 - -
120.56.236.46 - - [06/Mar/2012:00:00:00 -0800] "GET /hrefadd.xml HTTP/1.1" 204 214 - -
49.138.106.21 - - [06/Mar/2012:00:00:00 -0800] "GET /add.txt HTTP/1.1" 204 214 - -
117.195.185.130 - - [06/Mar/2012:00:00:00 -0800] "GET /mysidebars/newtab.html HTTP/1.1" 404 0 - -
122.160.166.220 - - [06/Mar/2012:00:00:00 -0800] "GET /mysidebars/newtab.html HTTP/1.1" 404 0 - -

1 Ответ

4 голосов
/ 12 марта 2012

Прежде всего, не изобретайте велосипед, а используйте объект Counter .

Во-вторых, используйте re.match() для извлечения IP-адресов - таким образом вам не нужно обрабатывать строки, которые не должны обрабатывать строки, которые не имеют анализируемого IP-адреса по-разному.

Что-то вроде;

import re
from collections import Counter

cnt = Counter()
ipre = re.compile(r'^(?P<ip>(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])) - -')
with open(infilename) as infile:
    for line in infile:
        m = ipre.match(line)
        if m is not None:
            ip = m.groupdict()['ip']
            cnt[ip] += 1
...