1

我的程序读入一个大的日志文件。然后它在文件中搜索 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]“头/HTTP/1.1”200-“-”“checks.panopta.com”5.63.145.71--[30/Jun/2013:08:04:51 -0500]“头/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 添加到我的输出中怎么样,时间戳会明显不同,但是只是在同一行上获取其中一个值,这可能吗?

4

2 回答 2

3

将您的打印语句移到主循环之外

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 

作为提示,您可以利用 pythonsCounter类来替换您的 try except 块

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 
于 2013-07-17T17:44:16.123 回答
2

您可以使用Counter效率更高的 a:

from collections import Counter
cnt = Counter()
for line in x:
    m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()
    cnt.update(m)

然后在主循环外完成打印:

for k,v in cnt.iteritems():
    print k, v

要包括 c,adefaultdict会更合适:

dict = defaultdict(list)
for line in x:
    m = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line).group().split()[0]
    c = re.search(r"\[(.+)\]",line).group().split()[0]
    dict[m].append(c)

for k,v in dict.iteritems():
    print k, len(v), v

据我了解,每行只有 1 个 ip 和日期,因此[0]第一次也是唯一一次出现。

于 2013-07-17T17:49:10.667 回答