在用awk处理文本时,需要将源数据为点分式形式的掩码转换为十进制形式的掩码,下边的函数可简单实现:

  • 转换功能函数cdr2mask
function cdr2mask(mask_point) {
num=gsub("255.","",mask_point)
#print mask_point
gsub("[\\.]0","",mask_point)
#print mask_point
mask=mask_point-0
for(i = 0;mask > 0;i++){
if (mask % 2^(7-i) == 0){
i++
break
}else{
mask -= 2^(7-i)
}
}
mask_decade = 8*num + i
return mask_decade
}
  • 源数据
 <ZJHZ-BA-IPNET-RT07-NE40EX16A>dis cur configuration  bgp
#
ipv4-family vpn-instance ChinaMobile_IMS_Media
network 10.3.160.20 0.0.0.0
network 10.3.160.48 255.255.255.252
network 10.3.160.56 255.255.255.128
  • awk完整程序
#!/bin/awk -f
# author: wholj
# date: 2018-09-05 # awk开始处理文本 # JSON构造函数
function json(dict,end_tag)
{
count=0
printf("\t{\n")
for(key in dict){
++count
if(count==length(dict)){
printf("\t\t\"%s\":\"%s\"\n",key,dict[key])
}
else{
printf("\t\t\"%s\":\"%s\",\n",key,dict[key])
}
}
if(end_tag==1){
printf("\t}\n")
}
else{
printf("\t},\n")
}
} # 将点分式形式的掩码转换为十进制形式的掩码(255.255.255.0 --> 24)
function cdr2mask(mask_point) {
num=gsub("255.","",mask_point)
#print mask_point
gsub("[\\.]0","",mask_point)
#print mask_point
mask=mask_point-0
for(i = 0;mask > 0;i++){
if (mask % 2^(7-i) == 0){
i++
break
}else{
mask -= 2^(7-i)
}
}
mask_decade = 8*num + i
return mask_decade
} # awk开始处理传入的文本文件
{
# 将文件中的\r换行替换为\n
gsub("\r","\n",$0)
# 获取VPN的名称
if ( NF==3 && $1~/ipv4-family/ && $2~/vpn-instance/ ){
#print $0
vpn_name = $3
#print vpn_name
}
# 得到路由信息
if( NF==3 && $1~/network/ && $2~/[0-9]+.[0-9]+.[0-9]+.[0-9]+/ && $3~/[0-9]+.[0-9]+.[0-9]+.[0-9]+/ ){
#print $0
#print cdr2mask($3)
route_info[vpn_name, NR] = vpn_name"|"$2"/"cdr2mask($3)
#print route_info[vpn_name, NR]
}
}
END{
print "["
row_count=0
# 遍历数组,组合json格式
for( route in route_info ){
++row_count
split(route_info[route], route_arr, "|")
#print route_arr[1]
#print route_arr[2]
route_dict["vpn_name"]=route_arr[1]
route_dict["route_info"]=route_arr[2]
if ( row_count==length(route_info) ){
json(route_dict,"1")
}else{
json(route_dict,"0")
}
}
print "]"
}
  • 测试结果

[
{
"vpn_name":"ChinaMobile_IMS_Media",
"route_info":"10.3.160.20/0"
},
{
"vpn_name":"ChinaMobile_IMS_Media",
"route_info":"10.3.160.48/30"
},
{
"vpn_name":"ChinaMobile_IMS_Media",
"route_info":"10.3.160.56/25"
}
]

awk函数实现将点分式形式的掩码转换为十进制形式的掩码的更多相关文章

  1. Linux提取不匹配字符串的行和列(awk函数)

    如下图所示,想把含有‘-nan’字符串的行提取出来 则用到awk函数,命令行如下: awk '{if($3!="-nan"){print $3}}' CHB_vs_ITU.weir ...

  2. (转)AWK函数

    http://wiki.jikexueyuan.com/project/awk/built-in-functions.html-------内置函数 http://wiki.jikexueyuan.c ...

  3. Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题

    转: Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题 在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: ...

  4. jquery如何将获取的颜色值转换为十六进制形式

    jquery如何将获取的颜色值转换为十六进制形式:大家或许已经注意到了,在谷歌.火狐和IE8以上浏览器中,获取的颜色值是RGB形式,例如rgb(255,255,0),感觉非常不适应,或者在实际编码中不 ...

  5. java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果

    package com.llh.demo; import java.util.Scanner; /** * * @author llh * */ public class Test { /* * 将任 ...

  6. 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来。

    问题 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来. 代码 data segment arrey db 0,1,2,4,6,5,7,9,8, ...

  7. linux awk函数

    这节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y ...

  8. 【三剑客】awk函数

    1. 内置函数 awk的内置函数有算术.字符串.时间.位操作和其它杂项的函数. 1.1 算术函数 atan2(y,x)  返回弧度的反正切(y/x) cos(expr)  返回expr的余弦(以弧度形 ...

  9. awk函数实现将简化IPV6地址补全

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

随机推荐

  1. HDU-2036 改革春风吹满地 (数学)

    Problem Description "改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如此简 ...

  2. jdbc url的若干参数

    参数名称 参数说明 缺省值 最低版本要求 user 数据库用户名,用于连接数据库 无 所有版本 password 用户密码(用于连接数据库) 无 所有版本 useUnicode 是否使用Unicode ...

  3. restful设计参考

    https://www.cnblogs.com/pyspark/p/8599210.html 以下查阅多处文档,思考总结: 所谓restful规范代表一种理想状态,首先对此种规范表示赞同,但应不忘实事 ...

  4. QQ第三方登录(二)

    首先我们先来看一下我的目录 Connect2.1  是我们从下载的SDK,内容包含 其他文件在配置之后全部删除了! index.html 是我们点击登陆的页面(以下为html中的代码) <cen ...

  5. PP: Reconstructing time series into a complex network to assess the evolution dynamics of the correlations among energy prices

    Purpose detect the dynamics in time series of their correlation Methodology 1. calculate correlation ...

  6. python之路之线程,进程,协程2

    一.线程 1.创建线程 2.主线程是否等待子线程 t.setDaemon(Ture/False):默认是false,等待子线程完成,ture,表示不等待子线程结束 3.主线程等待,子线程执行 join ...

  7. LCA 倍增算法模板

    . #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm&g ...

  8. 第七章 类(class)7.1 笔记

    最好不要把对象的定义和类的定义放在一起,这么做无异于把两种不同实体的定义混在了一条语句里,一会定义类,一会又定义变量,显然这是一种不被建议的行为. 类的定义最后要加上分号(:) 成员函数的声明必须放在 ...

  9. 题解 【Codeforces489B】 BerSU Ball

    本题是排序基础题. 我们可以将a[i].b[i]分别从小到大排序后,依次枚举比较两两组合是否符合要求,最后输出答案ans即可. AC代码: #include <bits/stdc++.h> ...

  10. Linux中通配符

    通配符是由shell处理的, 它只会出现在 命令的“参数”里.当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩 ...