我试图在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()
答案 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
...
这假设您正在接收干净的输入。在处理数据之前,您必须对数据进行清理。