从日志中获取重复的IP并写入新文档或日志

时间:2018-06-19 00:36:20

标签: python python-3.x

我试图在read.log中找到列出超过3次的IP地址。 一旦找到,我想打印一次IP地址并将其写入writelist.log。

我一直在尝试使用一套,但我不知道如何打印和只写IP地址。

例如,如果read.log包含...

10.1.89.11
255.255.255.255
255.255.255.255
10.5.5.5
10.5.5.5
10.5.5.5
10.5.5.5
255.255.255.255
255.255.255.255

我只想打印并将以下内容保存到writelist.log

255.255.255.255
10.5.5.5

使用我当前的代码,我正在打印并保存此内容......

set([])
set([])
set([])
set([])
set([])
set([])
set(['10.5.5.5'])
set(['10.5.5.5'])
set(['10.5.5.5', '255.255.255.255'])

我不想打印set([])或重复的IP地址。

我知道我可以使用string.replace()方法来摆脱其中一些但是有更好的方法吗?可能没有一套?

这是我的代码......

import re

login_attempts = 3

def run():

    try:
        with open("read.log", "r+") as log:
            ip_list = []
            for line in log:
                address = "^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$"
                match = re.match(address, line)

                if (match):
                    match = match.group()
                    ip_list.append(match.strip())
                    s = set([i for i in ip_list if ip_list.count(i) > login_attempts])

                    strs = repr(s)  # use repr to convert to string
                    with open("writelist.log", "a") as f:
                        f.write(strs)

                else:
                    continue
                log.close
    except OSError as e:
        print (e)

run()

1 个答案:

答案 0 :(得分:3)

使用Counter

import collections
with open('read.log', 'r+') as f:
     # Place into a counter and remove trailing newline character
     count = collections.counter(f.read().splitlines())

哪个会给出

Counter({'10.1.89.11': 1, '255.255.255.255': 4, '10.5.5.5': 4})

然后,您可以遍历Counter

for ip, n in count.items():
    print(ip, n)
    # Process the IP
    ...

这假设您正在接收干净的输入。在处理数据之前,您必须对数据进行清理。