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

如何用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
    }
}

怎么使用?

  1. 把上面的代码保存成expand_ips.awk文件
  2. 运行命令处理你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:38:15