awk函数实现将点分式形式的掩码转换为十进制形式的掩码
在用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函数实现将点分式形式的掩码转换为十进制形式的掩码的更多相关文章
- Linux提取不匹配字符串的行和列(awk函数)
如下图所示,想把含有‘-nan’字符串的行提取出来 则用到awk函数,命令行如下: awk '{if($3!="-nan"){print $3}}' CHB_vs_ITU.weir ...
- (转)AWK函数
http://wiki.jikexueyuan.com/project/awk/built-in-functions.html-------内置函数 http://wiki.jikexueyuan.c ...
- Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题
转: Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题 在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: ...
- jquery如何将获取的颜色值转换为十六进制形式
jquery如何将获取的颜色值转换为十六进制形式:大家或许已经注意到了,在谷歌.火狐和IE8以上浏览器中,获取的颜色值是RGB形式,例如rgb(255,255,0),感觉非常不适应,或者在实际编码中不 ...
- java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果
package com.llh.demo; import java.util.Scanner; /** * * @author llh * */ public class Test { /* * 将任 ...
- 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来。
问题 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来. 代码 data segment arrey db 0,1,2,4,6,5,7,9,8, ...
- linux awk函数
这节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y ...
- 【三剑客】awk函数
1. 内置函数 awk的内置函数有算术.字符串.时间.位操作和其它杂项的函数. 1.1 算术函数 atan2(y,x) 返回弧度的反正切(y/x) cos(expr) 返回expr的余弦(以弧度形 ...
- awk函数实现将简化IPV6地址补全
在用awk处理文本时,有些场景需要将简化的IPV6地址补充成完整的IPV6地址,下边函数可简单实现: IPV6地址补全函数 # ipv6地址补全函数 function compipv6(orig_ad ...
随机推荐
- Android 开发 facebook分享,登陆,获取信息
1 搭建开发环境 1.1 在Facebook官网SDK中,下载4.0.0的SDK包. 1.2 使用Eclipse导入SDK包中的Facebook工程,并添加android-supp ...
- 2、gitlab使用及权限管理
目录 1.创建用户组... 2 2.创建用户... 4 3.新建项目... 5 4.linux端访问项目... 6 4.1 通过ssh方式访问... 6 4.2 通过http访问... 9 5.win ...
- linux安装php-laravel环境
1.运用传说中的宝塔面板安装(https://www.bt.cn/download/linux.html)网站地址 在xshell软件中安装一下命令 1.1 宝塔centos安装 wget -O in ...
- STL初学
标准模板库STL初学 线性数据结构 vector 一维向量,相当于数组 list 链表 map 映射,提供(Key,Value)式操作,相当于哈希表 string char字符串 queue 队列,先 ...
- 关于按下ctrl+z后,之后的cin失效的问题
下面这代码按下Ctrl+z结束while输入后,接下来的cin >> val2就无法输入了 #include <iostream> #include <vector> ...
- 牛客CSP-S提高组赛前集训营2 赛后总结
比赛链接 A.服务器需求 维护每天需要的服务器数量的全局最大值(记为\(Max\))和总和(记为\(sum\)),那么答案为: \[max(Max,\lceil\dfrac{sum}{m}\rceil ...
- c#中的强类型、弱类型和泛型
强类型和弱类型的变量都有两个属性:类型和值. 强类型的变量类型是不能改变的,弱类型的变量类型是随需改变的,这是强弱的真正含义. 我们在编写c#代码时,变量类型是明确的,不可更改的,如string就是s ...
- 题解 SP27102/UVA1747 【Swap Space】
SP27102 [Swap Space] 双倍经验:UVA1747 Swap Space 用(a,b)表示每个硬盘的原容量和新文件系统下的容量.分两种情况考虑:a≤b和a>b 第一类a≤b格式化 ...
- Strategic game(无向?)二分图最小点覆盖(Poj1463,Uva1292)
原题链接 此题求二分图的最小点覆盖,数值上等于该二分图的最大匹配.得知此结论可以将图染色,建有向图,然后跑匈牙利/网络流,如下.然而... #include<iostream> #incl ...
- 每天进步一点点------Nios II 的Run as hardware 中报错:Downloading ELF Process failed
今天继续调试,又出现了新问题.在执行NIOS程序代码时,不能下载了:Pausing target processor: not responding. Resetting and trying aga ...