You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:24:03