需求: 读取文件夹下面的log文件,然后统计有哪些ip访问了主机的哪个端口
大概日志存放位置和日志格式为
image.png
初步思想:
import os模块
手动输出文件夹名,然后os.listdir(),把文件夹下的文件以列表形式放入,
根据len(listdir)依次遍历,拼接log文件路径,os.path.join(文件夹,文件名)
用os.isfile判断是否是文件,是的话readlines()
这里读取的时候遇到一个BUG,转码问题,open(encoding='ISO-8859-1'),加上即可
import re
import os
# def write_ip(ip):
# with open('test.txt', 'a') as f:
# for i in ip:
# f.write(i + ' ')
# def write_port(port):
# with open('test.txt', 'a') as f:
# for p in port:
# f.write(p + '\n')
#
# with open('project/u_ex191011.log', 'r') as f:
# datas = f.readlines()
# for data in datas:
# if data:
# # print(data)
# # print(re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", data))
# # print(re.findall(r"\b[0-2][0-9]{0,2}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\b", data))
# ip = re.findall(r"\b[0-2][0-9]{0,2}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\b", data)
# write_ip(ip)
# # print(re.findall(r"\s(\d{1,5})\s\-", data))
# port = re.findall(r"\s(\d{1,5})\s\-", data)
# write_port(port)
def logs_ip_port_sup(dir):
rootdir = dir
# 把文件夹下的文件放进列表中
list1 = os.listdir(rootdir)
dict_ip_port = {}
for i in range(0, len(list1)):
# 拼接路径
path = os.path.join(rootdir, list1[i])
print(path)
# 判断是文件才执行
if os.path.isfile(path):
with open(path, 'r', encoding="ISO-8859-1") as f:
datas = f.readlines()
for data in datas[:20]:
if data:
# print(data)
# print(re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", data))
# print(re.findall(r"\b[0-2][0-9]{0,2}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\b", data))
ip = re.findall(r"\s[0-2][0-9]{0,2}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\s", data)
# write_ip(ip)
# print(re.findall(r"\s(\d{1,5})\s\-", data))
port = re.findall(r"\s(\d{1,5})\s\-", data)
# write_port(port)
ip_port = ip + port
# print(ip+port)
# 判断是否为空,去除头4条空列表
if ip_port != [] and len(ip_port) == 3:
# 如果端口存在,直接添加访问的ip
# print(ip_port)
if ip_port[2] in dict_ip_port.keys():
if ip_port[1] not in dict_ip_port[ip_port[2]]:
dict_ip_port[ip_port[2]].append(ip_port[1])
# 如果端口不存在,在字典中添加端口(key),并添加ip(vaule)
else:
dict_ip_port[ip_port[2]] = []
dict_ip_port[ip_port[2]].append(ip_port[1])
# 结果为 {端口:[访问ip]}
print(dict_ip_port)
看你需要什么格式.我这把格式定为,{port:[ip1,ip2,ip3.......]}
就可以满足需求,主机哪个端口,有哪些ip过来访问,并且去重.
{'8701': [' 192.168.8.124 ', ' 192.168.14.101 ', ' 10.49.91.37 ', ' 192.168.14.105 ']}
最后可以把字典输出成一个txt
def output_txt(dict_ip_port, rootdir):
with open('result-{}.txt'.format(rootdir), 'w') as f:
for port, list_ip in dict_ip_port.items():
f.write(port + ':' + '\n')
for ip in list_ip:
f.write(ip + '\n')
希望大神能够给予批评,谢谢啦