2019-06-12
适用与华为路由器配置中查找IP地址(v4 v6),能挑区分vpn地址,是ip地址备案及统计的小工具。减少ip地址手工汇总时间(以往2天手工量,现在1小时搞定),针对其他厂家设备,稍微修改即可完成汇总。针对非同行、格式化、块操作、另辟蹊径(用正则表达式),减少代码量,网上有很多正则表达式的在线网站,可以尝试匹配方案。(稍微修改可以满足思科路由器)
# -*- encoding: utf-8 -*-
import re
import os
#匹配端口的正则表达式(可以跨行匹配)
intpat = re.compile(r'interface(.*?)#{1,2}', flags=re.DOTALL)
#匹配Ipv4的正则表达式
#ipv4pat = re.compile('''((ip(\s)address(\s))(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5]\.))''',re.I)
#匹配Ipv4加掩码
ipv4_mapat = re.compile('''((ip(\s)address(\s))(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)(\s)(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d))''',re.I)
#匹配Ipv6的正则表达式
ipv6pat = re.compile('''((ipv6(\s)address(\s))(([a-f0-9]{1,4}:|){0,7}[::]{0,1}[a-f0-9]{0,4})/\d{1,3})''',re.I)
#掩码变换,有格式,不能合并行
exchange_mask = lambda mask: sum(bin(int(i)).count('1')
for i in mask.split('.'))
def maskchange(str):
ipaddr_mask_l = str
list_ipaddr = ipaddr_mask_l .split()
ipaddr_mask_s = exchange_mask( list_ipaddr[-1])
tmp = '%d' %ipaddr_mask_s
out_addr = ' '.join(list_ipaddr[:-1])+'/'+tmp
return(out_addr)
#命令行定位到要挑出ip的文件夹,逐个文件挑出ip地址
filelist=os.listdir('.')
for file in filelist:
filename_ext=file+'11.log'
#文件名最好不要用空格和中文
with open(file,'r',encoding='utf-8') as fp,open(filename_ext,'w',encoding='utf-8') as fp1:
xx = fp.readlines()
#list转化为str,用于findall
str_con= ' '.join(xx)
zz = intpat.findall(str_con)
for ip in zz:
#v4add = ipv4pat.search(ip)
ipv4_mask=ipv4_mapat.search(ip)
v6add = ipv6pat.search(ip)
if(ip.find('vpn')) > 0:
if ipv4_mask is not None:
ipaddr_mask = ipv4_mask.group()
out_str = maskchange(ipaddr_mask)
w1='vpn '+out_str+'\n'
print('vpn ', out_str)
fp1.write(w1)
continue # 输出为vpn后不再输入为普通地址
if ipv4_mask is not None:
ipaddr_mask = ipv4_mask.group()
out_str = maskchange(ipaddr_mask)
w2= out_str+'\n'
print( out_str)
fp1.write(w2)
if v6add is not None:
v6addr=v6add.group()
w3 =v6addr+'\n'
print(v6addr)
fp1.write(w3)
#存在问题目前针对配置了辅助ip地址的,只能取到第一个主用ip