2014-11-22 4 views
1

У меня есть файл журнала wget и вы хотите проанализировать файл, чтобы я мог извлечь необходимую информацию для каждой записи журнала. Например, IP-адрес, временная метка, URL-адрес и т. Д.Parse wget log file in python

Ниже приведен пример файла журнала. Количество строк и деталей информации не одинаково для каждой записи. То, что является последовательным, - это обозначение каждой строки.

Я могу выделить отдельные строки, но я хочу многомерный массив (или аналогичный):

import re 

f = open('c:/r1/log.txt', 'r').read() 


split_log = re.findall('--[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.*', f) 

print split_log 

print len(split_log) 

for element in split_log: 
    print(element) 


####### Start log file example 

2014-11-22 10:51:31 (96.9 KB/s) - `C:/r1/www.itb.ie/AboutITB/index.html' saved [13302] 

--2014-11-22 10:51:31-- http://www.itb.ie/CurrentStudents/index.html 
Connecting to www.itb.ie|193.1.36.24|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: ignored [text/html] 
Saving to: `C:/r1/www.itb.ie/CurrentStudents/index.html' 

    0K .......... .......          109K=0.2s 

2014-11-22 10:51:31 (109 KB/s) - `C:/r1/www.itb.ie/CurrentStudents/index.html' saved [17429] 

--2014-11-22 10:51:32-- h ttp://www.itb.ie/Vacancies/index.html 
Connecting to www.itb.ie|193.1.36.24|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: ignored [text/html] 
Saving to: `C:/r1/www.itb.ie/Vacancies/index.html' 

    0K .......... .......... ..        118K=0.2s 

2014-11-22 10:51:32 (118 KB/s) - `C:/r1/www.itb.ie/Vacancies/index.html' saved [23010] 

--2014-11-22 10:51:32-- h ttp://www.itb.ie/Location/howtogetthere.html 
Connecting to www.itb.ie|193.1.36.24|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: ignored [text/html] 
Saving to: `C:/r1/www.itb.ie/Location/howtogetthere.html' 

    0K .......... .......          111K=0.2s 
+0

Каков ваш ожидаемый результат? –

+0

В конце концов я напишу записи в базу данных. Например. IP-адрес, URL-адрес, данные и т. Д. Из приведенного выше примера я поэтому потребую что-то вроде даты (1), url (1), http_request (1) для первой записи в журнале, а затем даты (2), url (2), http_request (2) для второго и т. д. – Markus

ответ

1

Вот как вы можете извлечь данные, которые вы хотите, и сохранить его в список кортежей.

Регулярные выражения, которые я использовал здесь, не идеальны, но они работают нормально с вашими данными образца. Я изменил ваше исходное регулярное выражение, чтобы использовать более читаемый \d вместо эквивалента [0-9]. Я также использовал необработанные строки, которые обычно облегчают работу с регулярными выражениями.

Я ввел ваши данные журнала в свой код в виде строки с тремя кавычками, поэтому мне не нужно беспокоиться о обработке файлов. Я заметил, что есть пробелы в некоторых из URL-адресов в файле журнала, например

h ttp://www.itb.ie/Vacancies/index.html

, но я предполагаю, что эти пространства являются артефактом копия & оклейки, и они на самом деле не существует в реальном журнале данные. Если это не так, ваша программа должна будет выполнить дополнительную работу, чтобы справиться с такими посторонними пространствами.

Я также изменил IP-адреса в данных журнала, поэтому они не все одинаковы, просто чтобы убедиться, что каждый найденный IP findall правильно связан с правильной временной отметкой & URL.

#! /usr/bin/env python 

import re 

log_lines = ''' 

2014-11-22 10:51:31 (96.9 KB/s) - `C:/r1/www.itb.ie/AboutITB/index.html' saved [13302] 

--2014-11-22 10:51:31-- http://www.itb.ie/CurrentStudents/index.html 
Connecting to www.itb.ie|193.1.36.24|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: ignored [text/html] 
Saving to: `C:/r1/www.itb.ie/CurrentStudents/index.html' 

    0K .......... .......          109K=0.2s 

2014-11-22 10:51:31 (109 KB/s) - `C:/r1/www.itb.ie/CurrentStudents/index.html' saved [17429] 

--2014-11-22 10:51:32-- http://www.itb.ie/Vacancies/index.html 
Connecting to www.itb.ie|193.1.36.25|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: ignored [text/html] 
Saving to: `C:/r1/www.itb.ie/Vacancies/index.html' 

    0K .......... .......... ..        118K=0.2s 

2014-11-22 10:51:32 (118 KB/s) - `C:/r1/www.itb.ie/Vacancies/index.html' saved [23010] 

--2014-11-22 10:51:32-- http://www.itb.ie/Location/howtogetthere.html 
Connecting to www.itb.ie|193.1.36.26|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: ignored [text/html] 
Saving to: `C:/r1/www.itb.ie/Location/howtogetthere.html' 

    0K .......... .......          111K=0.2s 
''' 

time_and_url_pat = re.compile(r'--(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})--\s+(.*)') 
ip_pat = re.compile(r'Connecting to.*\|(.*?)\|') 

time_and_url_list = time_and_url_pat.findall(log_lines) 
print '\ntime and url\n', time_and_url_list 

ip_list = ip_pat.findall(log_lines) 
print '\nip\n', ip_list 

all_data = [(t, u, i) for (t, u), i in zip(time_and_url_list, ip_list)] 
print '\nall\n', all_data, '\n' 

for t in all_data: 
    print t 

выхода

time and url 
[('2014-11-22 10:51:31', 'http://www.itb.ie/CurrentStudents/index.html'), ('2014-11-22 10:51:32', 'http://www.itb.ie/Vacancies/index.html'), ('2014-11-22 10:51:32', 'http://www.itb.ie/Location/howtogetthere.html')] 

ip 
['193.1.36.24', '193.1.36.25', '193.1.36.26'] 

all 
[('2014-11-22 10:51:31', 'http://www.itb.ie/CurrentStudents/index.html', '193.1.36.24'), ('2014-11-22 10:51:32', 'http://www.itb.ie/Vacancies/index.html', '193.1.36.25'), ('2014-11-22 10:51:32', 'http://www.itb.ie/Location/howtogetthere.html', '193.1.36.26')] 

('2014-11-22 10:51:31', 'http://www.itb.ie/CurrentStudents/index.html', '193.1.36.24') 
('2014-11-22 10:51:32', 'http://www.itb.ie/Vacancies/index.html', '193.1.36.25') 
('2014-11-22 10:51:32', 'http://www.itb.ie/Location/howtogetthere.html', '193.1.36.26') 

Это последняя часть этого кода использует список понимание реорганизовать данные в time_and_url_list и ip_list в единый список кортежей, с помощью zip встроенными чтобы обрабатывать два списка параллельно. Если этой части немного сложно следовать, пожалуйста, дайте мне знать &. Я попытаюсь объяснить это дальше.

+0

приятный. Спасибо за это! Именно то, что мне нужно ... – Markus