AWK作为ifconfig过滤器提取指定格式网卡信息的方法
ifconfig输出精简提取的AWK实现方案
现存的过滤痛点
你之前编写的链式过滤命令ifconfig | awk 'BEGIN{ORS=RS="\n\n"} !/^lo/{print}' | awk '{print $1, $2}' | awk '!/^RX/{print}' | awk '!/^TX/{print}'已经实现了基础过滤能力:
- 按空行分割独立网卡信息块,剔除lo回环接口内容
- 过滤掉了RX、TX开头的收发流量统计行
但当前输出仍有两类冗余:
- 带
flags字段的接口首行保留了全部附属参数(flags标记集合、mtu值等),如果用awk '!/flags=/{print}'做整行匹配删除,会把接口名称本身也一并删掉,无法满足需求 - 输出保留了全部inet6对应的IPv6地址行,属于非必要信息
核心裁剪能力实现思路
你之前遇到的“想删除flags附属参数但怕把接口名称一起删掉”的问题,本质是只使用了整行匹配删除的逻辑。AWK本身支持任意粒度的内容处理,既可以做整行的匹配过滤,也可以对单行内的内容做拆分、截取、重组,不需要靠粗暴的整行删除实现需求。具体实现逻辑分为三部分:
- 针对带flags的接口首行:不删除整行,只提取行首的接口名称部分,丢弃后续所有冗余参数
- 针对不需要的行(inet6行、其他附属统计行):直接跳过整行即可
- 针对需要保留的行(IPv4的inet行、MAC地址的ether行):直接输出整行内容
可直接运行的优化命令
ifconfig | awk ' # 按空行分割每个网卡的独立信息块,避免跨接口的内容匹配错乱 BEGIN { RS=""; ORS="\n\n" } # 跳过lo回环接口的整块内容 /^lo/ { next } # 处理带flags的接口首行:拆分后只保留接口名称加冒号的格式 /^[a-zA-Z0-9_-]+:/ && /flags=/ { split($0, name_part, ":") print name_part[1] ":" next } # 保留IPv4地址行(匹配行首带空白后接inet的内容,自动跳过inet6行) /^[[:space:]]+inet / { print $0 } # 保留MAC地址行 /^[[:space:]]+ether / { print $0 } # 其余所有内容(inet6地址、流量统计、错误提示等)全部跳过 { next } '
输出效果
执行后输出完全匹配预期格式:
enp2s0f1: ether xx:xx:xx:xx:xx:xx wlp3s0: inet xxx.xxx.xxx.xxx ether xx:xx:xx:xx:xx:xx
没有冗余的flags参数、IPv6地址、流量统计内容,每个接口块之间自动空行分隔。
内容的提问来源于stack exchange,提问作者kamil_debski
相关产品推荐
相关产品推荐

