2012-03-12 2 views
0

У меня есть скрипт python, который извлекает уникальные IP-адреса из файла журнала и отображает их количество, сколько раз эти 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-адреса.

E.g. если я прохожу 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

Ваш вопрос не имеет большого смысла. Пожалуйста, объясните, «сколько раз IP-адрес отправляется на URL-адрес, который мы передаем». –

+0

@JimGarrison, я надеюсь, что я отредактировал этот вопрос, чтобы лучше понять проблему. –

+0

@ Raju.allen: не могли бы вы разместить пример файла журнала, который используется в качестве входных данных (возможно, пример игрушки с удаленной личной информацией?) –

ответ

2

Прежде всего, не изобретать велосипед, а использовать 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 
+0

, но как я могу использовать это в моем коде python? извините, я новичок в python. –

Смежные вопросы