在用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开始处理传入的文本文件
{
# 将文件中的\r换行替换为\n
gsub("\r","\n",$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

awk函数实现将简化IPV6地址补全的更多相关文章

  1. Nginx 自动补全url地址补全最后的斜线

    参考地址: http://blog.csdn.net/dong123dddd/article/details/51660368 location /riskcontrol { root /data; ...

  2. TCL函数“参数自动补全” 与 “help 信息显示”

    tcl 函数参数自动补全和 help 信息显示 在EDA tool 中使用命令时,命令的参数可以通过 tab 键自动补全,而且可以使用 -help 显示帮助信息,使用起来很方便: 那么我们自己编写的 ...

  3. Shell脚本中实现自动补全功能

    对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...

  4. Bash的自动补全

    内置补全命令 Bash内置两个补全命令,分别是compgen和complete.compgen命令根据不同的参数,生成匹配单词的候选补全列表,例子如下: monster@monster-Z:~$ co ...

  5. 使用Linux自定义自动补全命令完善自己的shell脚本

    对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...

  6. eclipse代码自动补全。

    打开 Eclipse -> Window -> Perferences 找到Java 下的 Editor 下的 Content Assist , 右边出现的选项中,有一个Auto acti ...

  7. Python3设置在shell脚本中自动补全功能的方法

    本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...

  8. 编写 Bash 补全脚本

    编写 Bash 补全脚本   对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. B ...

  9. MyCLI :一个支持自动补全和语法高亮的 MySQL/MariaDB 客户端

    MyCLI 是一个易于使用的命令行客户端,可用于受欢迎的数据库管理系统 MySQL.MariaDB 和 Percona,支持自动补全和语法高亮.它是使用 prompt_toolkit 库写的,需要 P ...

随机推荐

  1. vue 动态组件的传值

    vue项目开发中会用到大量的父子组件传值,也会用到动态组件的传值,常规子组件获取父组件的传值时,第一次是获取不到的,这时候有两种解决方案 第一种: 父组件向子组件传的是一个json对象,ES6的方法O ...

  2. idea 配置 tomcat 教程

    最近在搞一个项目需要用到idea 配置tomcat,翻了翻网上的帖子发现稂莠不齐,最后决定还是自己写个吧!(其实我挺蠢的走了好多的弯路,哎~) 1.首先准备一个需要大家tomcat的工程,然后使用id ...

  3. 松软科技课堂:jQuery 事件函数

    jQuery 事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.术语由事件“触发”(或“激发”)经常会被使用. 通常会 ...

  4. Mac 安装IDEA 2018.3 版本

    注:本文转自https://blog.csdn.net/qq_41735004/article/details/86670039 写文文的目的是,怕博主删掉然后找不到所以就写一份 1.下载idea和破 ...

  5. linux切换普通用户遇bash-4.1解决

    1,修改vim  /etc/passwd 把对应用户的登陆环境改成,/bin/bash 2,复制配置 cp -a /etc/skel/. /home/www/ 3再次尝试su www有效

  6. moveTo 与 moveBy的区别 (转贴)

    MoveTo和MoveBy可以使精灵移动,区别在于MoveTo是移动到给定的坐标点:而MoveBy是从当前坐标点移动给定的坐标点这么多的距离.举个例子,假定精灵当前的坐标点是(x, y),分别给Mov ...

  7. 杭电1087 Super Jumping! Jumping! Jumping!(初见DP)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  8. 调用系统计算器n次

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void main1(){ int n ...

  9. 前后端分离构架 与 json ajax简介

    前后端分离 传统开发方式 曾几何时,JSP和Servlet为Java带来了无限风光,一时间大红大紫,但随着互联网的不断发展,这样的开发方式逐渐显露其弊端,在移动互联网炙手可热的今天,应用程序对于后台服 ...

  10. UI 自定义布局

    今天继续学习UI布局的布局管理器,昨天学习并练习使用了线性布局,相对布局和帧布局,今天学习表格布局,网格布局以及嵌套布局,相对于前三种布局,后三种布局比较复杂一些. 1.表格布局 TableLayou ...