zoukankan      html  css  js  c++  java
  • awk函数实现将简化IPV6地址补全

    在用awk处理文本时,有些场景需要将简化的IPV6地址补充成完整的IPV6地址,下边函数可简单实现:

    • IPV6地址补全函数
    # ipv6地址补全函数
    function compipv6(orig_address){
        # 分割IPV6地址
        split(orig_address, ipv6_addr, "/")
        n = split(ipv6_addr[1], ip_field, ":")
        full_addr=""
        # 切割简化的地址
        split(ipv6_addr[1], ip_field, ":")
        # 每个字段不足4位则高位补0
        for ( i=1; i<=n; i++){
            if ( length(ip_field[i]) == 0 ){
                ip_field[i] = "0000"
            }
            else if ( length(ip_field[i]) == 1 ){
                ip_field[i] = "000"ip_field[i]
            }
            else if ( length(ip_field[i]) == 2 ){
                ip_field[i] = "00"ip_field[i]
            }
            else if ( length(ip_field[i]) == 3 ){
                ip_field[i] = "0"ip_field[i]
            }
            # 组合临时简化的IPV6地址
            if ( i==1 ){
                full_addr = ip_field[i]
            }else{
                full_addr = full_addr":"ip_field[i]
            }
        }
        # 循环补全32位
        do{
            FS = ":"
            $0 = full_addr
            if( $(NF-1) == "0000" && $NF == "0000" ){
                n1 = 8-NF
                for ( i=1; i<=n1; i++ ){
                    full_addr=full_addr":0000"
                }
            }
            else if( $NF != "0000" ){
                n1 = 8-NF
                for ( i=1; i<=n1; i++ ){
                    full_addr=gensub(/0000/,"0000:0000",1,full_addr)
                }
            }
            FS=" "
        }while(0)
        # 判断原始数据是否有掩码位,有则需要返回掩码位
        if (orig_address !~ ///){
            return full_addr
        }
        else{
            return full_addr"/"ipv6_addr[2]
        }
    }
    
    • 需要解析适配的源数据
     vrf ChinaMobile_SGi
      rd 24059:4600
      address-family ipv6 unicast
       network 2409:8005:800::/127
       network 2409:8005:800::8/127
       network 2409:8005:800::10/127
       network 2409:8005:800::1c/127
       network 2409:8005:800::24/127
       network 2409:8015:800::/120
       network 2409:8015:800::100/120
       network 2409:8015:800:1::/64
       network 2409:8015:800:2::/64
       network 2409:8015:870::/44
       network 2409:8015:880::/43
       network 2409:8127:f200::/44
       network 2409:8127:f210::/44
       network 2409:8127:f220::/44
       network 2409:8127:f240::/44
       network 2409:8805:800::/43
       network 2409:8805:820::/43
       network 2409:8805:840::/44
       network 2409:8805:850::/44
       network 2409:8805:860::/43
       network 2409:8805:8a0::/43
       network 2409:8805:8c0::/43
      !
     !
    
    • awk完整程序
    #!/bin/awk -f 
    # author: wholj
    # date: 2018-12-21
    
    # ipv6地址补全函数
    function compipv6(orig_address){
        # 分割IPV6地址
        split(orig_address, ipv6_addr, "/")
        n = split(ipv6_addr[1], ip_field, ":")
        full_addr=""
        # 切割简化的地址
        split(ipv6_addr[1], ip_field, ":")
        # 每个字段不足4位则高位补0
        for ( i=1; i<=n; i++){
            if ( length(ip_field[i]) == 0 ){
                ip_field[i] = "0000"
            }
            else if ( length(ip_field[i]) == 1 ){
                ip_field[i] = "000"ip_field[i]
            }
            else if ( length(ip_field[i]) == 2 ){
                ip_field[i] = "00"ip_field[i]
            }
            else if ( length(ip_field[i]) == 3 ){
                ip_field[i] = "0"ip_field[i]
            }
            # 组合临时简化的IPV6地址
            if ( i==1 ){
                full_addr = ip_field[i]
            }else{
                full_addr = full_addr":"ip_field[i]
            }
        }
        # 循环补全32位
        do{
            FS = ":"
            $0 = full_addr
            if( $(NF-1) == "0000" && $NF == "0000" ){
                n1 = 8-NF
                for ( i=1; i<=n1; i++ ){
                    full_addr=full_addr":0000"
                }
            }
            else if( $NF != "0000" ){
                n1 = 8-NF
                for ( i=1; i<=n1; i++ ){
                    full_addr=gensub(/0000/,"0000:0000",1,full_addr)
                }
            }
            FS=" "
        }while(0)
        return full_addr"/"ipv6_addr[2]
    }
    
    # awk开始处理传入的文本文件
    {
        # 将文件中的
    换行替换为
    
        gsub("
    ","
    ",$0)
        if( NF==2 && $1~/network/ ){
            # 调用补全函数将IPV6地址补全
            print $2" --> "compipv6($2)
        }
    }
    
    • 解析适配结果
    2409:8005:800::/127 --> 2409:8005:0800:0000:0000:0000:0000:0000/127
    2409:8005:800::8/127 --> 2409:8005:0800:0000:0000:0000:0000:0008/127
    2409:8005:800::10/127 --> 2409:8005:0800:0000:0000:0000:0000:0010/127
    2409:8005:800::1c/127 --> 2409:8005:0800:0000:0000:0000:0000:001c/127
    2409:8005:800::24/127 --> 2409:8005:0800:0000:0000:0000:0000:0024/127
    2409:8015:800::/120 --> 2409:8015:0800:0000:0000:0000:0000:0000/120
    2409:8015:800::100/120 --> 2409:8015:0800:0000:0000:0000:0000:0100/120
    2409:8015:800:1::/64 --> 2409:8015:0800:0001:0000:0000:0000:0000/64
    2409:8015:800:2::/64 --> 2409:8015:0800:0002:0000:0000:0000:0000/64
    2409:8015:870::/44 --> 2409:8015:0870:0000:0000:0000:0000:0000/44
    2409:8015:880::/43 --> 2409:8015:0880:0000:0000:0000:0000:0000/43
    2409:8127:f200::/44 --> 2409:8127:f200:0000:0000:0000:0000:0000/44
    2409:8127:f210::/44 --> 2409:8127:f210:0000:0000:0000:0000:0000/44
    2409:8127:f220::/44 --> 2409:8127:f220:0000:0000:0000:0000:0000/44
    2409:8127:f240::/44 --> 2409:8127:f240:0000:0000:0000:0000:0000/44
    2409:8805:800::/43 --> 2409:8805:0800:0000:0000:0000:0000:0000/43
    2409:8805:820::/43 --> 2409:8805:0820:0000:0000:0000:0000:0000/43
    2409:8805:840::/44 --> 2409:8805:0840:0000:0000:0000:0000:0000/44
    2409:8805:850::/44 --> 2409:8805:0850:0000:0000:0000:0000:0000/44
    2409:8805:860::/43 --> 2409:8805:0860:0000:0000:0000:0000:0000/43
    2409:8805:8a0::/43 --> 2409:8805:08a0:0000:0000:0000:0000:0000/43
    2409:8805:8c0::/43 --> 2409:8805:08c0:0000:0000:0000:0000:0000/43
    
    by: wholj email: wholj7650@163.com
  • 相关阅读:
    php上传进度条
    array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
    password_hash 与 password_verify
    这是一个微信带参数的二维码,自定义菜单,与图文回复
    go to 语句用起来还是挺方便的
    初次使用海豚php的一个例子
    图片下载
    一对一的关联映射
    延迟加载
    proxy和proxy-no的策略取值区别
  • 原文地址:https://www.cnblogs.com/wholj/p/10182599.html
Copyright © 2011-2022 走看看