Linux ip命令输出提取IP及接口时CIDR掩码转换实现问题
解决方法
你原有代码的核心问题有两点:
- 子网掩码转CIDR逻辑是硬编码,仅覆盖3种场景,且未和对应接口的IP做绑定,容易出现匹配错位
- 按
\n\n(空行)分割段落的逻辑不符合你提供的原始输出格式,原始输出中每个网卡信息单独占一行,没有空行分隔
可以直接修改为如下代码,支持所有合法子网掩码转CIDR前缀,且自动绑定对应网卡与IP:
import re # 通用方法:点分十进制子网掩码转CIDR前缀 def mask_to_cidr(mask): return sum(bin(int(octet)).count('1') for octet in mask.split('.')) with open('rawdata.txt', 'r') as file: lines = file.readlines() # 预编译正则,一次匹配接口名、IP、子网掩码 pattern = re.compile(r'^(\S+).*?inet addr:(\S+).*?Mask:(\S+)') result_list = [] for line in lines: line = line.strip() if not line: continue match = pattern.search(line) if match: iface = match.group(1) ip = match.group(2) mask = match.group(3) cidr = mask_to_cidr(mask) ip_with_cidr = f"{ip}/{cidr}" result_list.append((iface, ip_with_cidr)) # 输出结果 print("Interface name | IP address") for iface, ip in result_list: print(f"{iface} | {ip}")
代码说明
- 新增
mask_to_cidr通用函数,不需要硬编码判断掩码值,所有合法IPv4子网掩码都能转换为对应CIDR前缀,支持/24、/25、/26等所有场景 - 正则一次匹配同一行的网卡名、IP、掩码,不会出现匹配错位问题
- 直接按行读取原始数据,适配你提供的输出格式
运行后输出完全符合你要求的格式:
Interface name | IP address eth0 | 192.168.2.100/24 eth1 | 10.10.2.100/24 lo | 127.0.0.1/8 ppp0 | 10.1.3.105/32 vmnet1 | 192.168.47.1/24 vmnet8 | 172.16.232.1/24 vmnet9 | 172.16.233.1/24 vmnet10 | 172.16.234.1/24
内容的提问来源于stack exchange,提问作者vile
相关产品推荐
相关产品推荐

