如何用Linux Bash命令展开IP范围为单个IP?最优方案咨询
用awk展开IP范围的最优方案
嘿,这个需求用awk完全能搞定,而且效率拉满!我给你分享个通用的实现方案,不管是简单的同段IP范围还是跨网段的复杂情况都能轻松处理:
完整awk脚本
我写了个带辅助函数的脚本,逻辑清晰还通用,能自动识别单个IP和IP范围:
function ip2num(ip, arr, num) { split(ip, arr, ".") num = arr[1] * 256^3 + arr[2] * 256^2 + arr[3] * 256 + arr[4] return num } function num2ip(num, a,b,c,d) { a = int(num / 256^3) num = num % 256^3 b = int(num / 256^2) num = num % 256^2 c = int(num / 256) d = num % 256 return a "." b "." c "." d } { # 先去除首尾空格,避免格式干扰 gsub(/^[ \t]+|[ \t]+$/, "", $0) if (index($0, " - ") > 0) { # 拆分起始和结束IP split($0, parts, " - ") start_num = ip2num(parts[1]) end_num = ip2num(parts[2]) # 遍历范围,逐个输出IP for (i=start_num; i<=end_num; i++) { print num2ip(i) } } else { # 单个IP直接输出 print $0 } }
怎么使用?
- 把上面的代码保存成
expand_ips.awk文件 - 运行命令处理你的IP文件(比如叫
ips.txt):
awk -f expand_ips.awk ips.txt
要是不想单独存文件,也可以直接用单行命令执行:
awk 'function ip2num(ip,arr,num){split(ip,arr,".");num=arr[1]*256^3+arr[2]*256^2+arr[3]*256+arr[4];return num}function num2ip(num,a,b,c,d){a=int(num/256^3);num=num%256^3;b=int(num/256^2);num=num%256^2;c=int(num/256);d=num%256;return a"."b"."c"."d}{gsub(/^[ \t]+|[ \t]+$/, "", $0);if(index($0," - ")>0){split($0,parts," - ");start=ip2num(parts[1]);end=ip2num(parts[2]);for(i=start;i<=end;i++)print num2ip(i)}else print $0}' ips.txt
为啥这是最优方案?
- 通用性强:不管是
10.10.128.38 - 10.10.128.53这种同段范围,还是192.168.1.254 - 192.168.2.5这种跨网段的情况,都能正确展开 - 效率高:awk处理文本的速度本来就快,用整数遍历比逐段判断逻辑更简洁高效,大文件也能轻松应对
- 易维护:把IP和整数的转换封装成函数,逻辑清晰,以后要调整格式或者扩展功能也方便
小提示
如果你的IP范围分隔符不是-(比如没有空格的-),只要修改split的分隔符和index的检测条件就行,比如把split($0, parts, " - ")改成split($0, parts, "-"),同时把index($0, " - ")改成index($0, "-")。
内容的提问来源于stack exchange,提问作者Tee Jay
相关产品推荐
相关产品推荐

