在用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. js及jsp.java查错的几种方式

    一.js 1.console.log("你想输出的内容"); 2.alert("你想输出的内容"); 3.debugger;(记得打开F12) 4.快速找到js ...

  2. wpf 程序启动显示图片

    一.设置图片的生成操作 程序启动时会出现0.5秒的图片显示,再显示程序界面. 二.写代码实现相同效果 /// <summary> /// App.xaml 的交互逻辑 /// </s ...

  3. Codeforces Round #614 (Div. 2) C - NEKO's Maze Game

    题目链接:http://codeforces.com/contest/1293/problem/C 题目:给定一个 2*n的地图,初始地图没有岩浆,都可以走, 给定q个询问,每个询问给定一个点(x,y ...

  4. php header的使用

    // okheader('HTTP/1.1 200 OK'); //设置一个404头:header('HTTP/1.1 404 Not Found'); //设置地址被永久的重定向header('HT ...

  5. 题解 【洛谷P4995】跳跳!

    一看题目名字,下意识地认为DP. 打开题目,发现是一道水的贪心,和DP没一分钱关系(毕竟是洛谷最水月赛的T2). 废话不多说. 看完题面,首先想到排序.要将乱序的石头高度变为有序,才能更好地想题. C ...

  6. winform常用控件介绍

    1.窗体 12.Label 控件 33.TextBox 控件 44.RichTextBox控件 55.NumericUpDown 控件 76.Button 控件 77.GroupBox 控件 78.R ...

  7. Linux - Shell - 算数表达式 - 位运算

    概述 shell 中基于 $(()) 的 位运算 背景 复习 shell 脚本 凑数吧 准备 环境 os centos7 1. 位运算 代码 #!/bin/bash # 位运算 arg1=2 arg2 ...

  8. Linux 基本命令简单学习

    平常工作中需要使用到的一些Linux基本命令,简单记录: 通过订单号查看日志:   cat /---/---/xxxx20190908.log | grep C52918588112261 -C 5 ...

  9. SpringMVC:Controller配置总结

    西部开源-秦疆老师:SpringMVC系列博客 , 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! SpringMVC:Controlle ...

  10. C#中画三角形和填充三角形的简单实现

    C#中画三角形和填充三角形的简单实现: private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graph ...