我的程序读取一个大的日志文件。然后,它将在文件中搜索IP和TIME(无论括号内是什么)。
5.63.145.71--[30 / Jun / 2013:08:04:46 -0500]“ HEAD / HTTP / 1.1” 200-“-”“ checks.panopta.com”
5.63.145.71--[30 / Jun / 2013:08:04:49 -0500]“ HEAD / HTTP / 1.1” 200-“-”“ checks.panopta.com”
5.63.145.71--[30 / Jun / 2013:08:04:51 -0500]“ HEAD / HTTP / 1.1” 200-“-”“ checks.panopta.com”
我想阅读整个文件,并总结如下条目:
Num 3 IP 5.63.145.1 TIME [30 / Jun / 2013:08:04:46 -0500]条目数,IP,TIME和DATE
到目前为止,我有:
import re
x = open("logssss.txt")
dic={}
for line in x:
m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
c = re.search(r"\[(.+)\]",line).group().split()
for i in range(len(m)):
try:
dic[m[i]] += 1
except:
dic[m[i]] = 1
k = dic.keys()
for i in range(len(k)):
print dic[k[i]], k[i]
上面的代码现在可以正确显示!谢谢。
6 199.21.99.83
1 5.63.145.71
编辑:那么现在如何将c添加到我的输出中,时间戳将明显不同,但是仅在同一行上获取值之一,这可能吗?
最佳答案
将打印语句移出主循环
import re
x = open("logssss.txt")
dic={}
for line in x:
m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
c = re.search(r"\[(.+)\]",line).group().split()
for i in range(len(m)):
try:
dic[m[i]] += 1
except:
dic[m[i]] = 1
for k,v in dic.iteritems(): #or items if Python 3.X
print k, v
作为提示,您可以利用pythons
Counter
类替换try try块from collections import Counter
dic = Counter()
for line in x:
m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
c = re.search(r"\[(.+)\]",line).group().split()
for i in range(len(m)):
dic[m[i]] += 1
for k,v in dic.iteritems(): #or items if Python 3.X
print k, v
根据您的评论,我只使用列表字典,可以从列表的长度中提取每个IP地址的计数:
dic = {}
for line in x:
m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
c = re.search(r"\[(.+)\]",line).group().split()
for i in range(len(m)):
dic.setdefault(m[i], []).append(c)
for k,v in dic.iteritems(): #or items if Python 3.X
print k, len(v), v
关于python - 计算字典中唯一项的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17706598/