适用与华为路由器配置中查找IP地址(v4 v6),能挑区分vpn地址,是ip地址备案及统计的小工具。减少ip地址手工汇总时间(以往2天手工量,现在1小时搞定),针对其他厂家设备,稍微修改即可完成汇总。针对非同行、格式化、块操作、另辟蹊径(用正则表达式),减少代码量,网上有很多正则表达式的在线网站,可以尝试匹配方案。(本次修改后,更适合阅读,格式保持一致)
# -*- encoding: utf-8 -*-
import re
import os
#匹配端口的正则表达式,对于正则表达式样式使⽤ Python 的原始字符串表示法;在带有 'r' 前缀的字符串字⾯值中,反斜杠不必做任何特殊处理
intpat = re.compile(r'interface(.*?)(!{1,2}|#{1,2})', flags=re.DOTALL)
# r'interface(.*?)(!{1,2}|#{1,2})',作用是查找匹配的块,这里华为用#作为分隔符,思科用!作为分隔符替换即可r'interface(.*?)!{1,2}',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地址
def findit():
items = os.listdir(".")
newlist = []
for names in items:
if names.endswith(".txt"):
newlist.append(names)
for file in newlist:
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:
str_ip=str(ip)
#v4add = ipv4pat.search(str_ip)
ipv4_mask=ipv4_mapat.search(str_ip)
v6add = ipv6pat.search(str_ip)
#华为使用 vpn 思科使用vrf 标识为vpn 地址
if(('vpn-instance' in str_ip) or('ip vrf' in str_ip)) > 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
if __name__ == "__main__":
findit()