如何使用AWK正则匹配子网掩码并拼接对应前置IP地址
问题根因
你之前套用的连续行字符串比对方案是面向多行逐行存储的文本设计的,和当前单行多字段的输入结构完全不匹配:你误用了记录行号变量NR做字段位置判断,而单行场景下需要遍历的是单条记录内的字段序号,而非行号。
实现思路
不需要硬编码固定掩码的起始字段位置,逐字段遍历整行内容即可自动适配任意数量的主机名、IP+掩码组合:
- 识别子网掩码特征:纯数字、取值在16~32区间
- 命中掩码规则时,将该字段与紧邻的前一个字段(即对应IP)拼接为
IP/掩码格式 - 将已完成拼接的掩码字段置空,避免重复输出
- 最终输出整行时,awk会自动保留原字段间的空白对齐格式
可直接运行的命令
awk '{ for(i=1; i<=NF; i++) { if ($i ~ /^[0-9]+$/ && $i >= 16 && $i <= 32) { $(i-1) = $(i-1) "/" $i $i = "" } } print $0 }' input.txt
适配说明
- 不限制前置主机名的数量,不管开头有几个非IP的主机名字段,都能原样保留
- 不限制IP+掩码的总组数,只要掩码符合16~32的整数规则,就能自动和前序IP完成拼接
- 输出的空白间隔和原输入对齐,不会打乱原有排版
内容的提问来源于stack exchange,提问作者user2954003
相关产品推荐
相关产品推荐

