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 ...
随机推荐
- 2020牛客寒假算法基础集训营6 I.导航系统 (最小生成树)
https://ac.nowcoder.com/acm/contest/3007/I 题中给定的图必定是一棵树 容易发现,如果将输入的N(N-1)个距离看做N(N-1)条无向边的话,那么如果数据合法, ...
- Vs2013以管理员身份运行
VS快捷方式目录下的devenv.exe 右键->兼容性疑难解答->疑难解答程序->勾选该程序需要附加权限即可,以后每次打开VS时都会以管理员身份运行了!
- 登录时 按Enter 进入登录界面 或者下一行
function keyLogin() { if (event.keyCode == 13) //回车键的键值为13 $(".btn-submit").click(); //调用登 ...
- shell问题汇总
1. sudo执行脚本找不到变量 当普通用户下,设置并export一个变量,然后利用sudo执行echo命令,能得到变量的值,但是如果把echo命令写入脚本,然后再sudo执行脚本,就找不到变量,未能 ...
- 模块一:shell 脚本基础
一.shell脚本介绍 (一)脚本案例及介绍: #!/bin/bash LOG_DIR=/var/log ROOT_UID=0 if ["$UID -ne "$ROOT_UID&q ...
- 记录 shell学习过程(1) 超简单的面向过程的2个shell 分区以及创建lvm
分区 #!/usr/bin/env bash #fdisk /dev/sdb << EOF #n # # # #+600M #w #EOF 创建lvm pvcreate /dev/sdb ...
- 【Python】数值运算操作符
- 快速搭建SSM框架环境开发项目【配置】
maven在线仓库https://mvnrepository.com/ maven构建项目 pom.xml <project xmlns="http://maven.apache.or ...
- dfs题型一
代码: #include <iostream> #include <algorithm> #include <vector> using namespace std ...
- 每天进步一点点------创建Microblaze软核(一)
在使用FPGA时,有时会用到它做为主控芯片.对于习惯于单片机及C语言开发的人,使用FPGA做主控芯片,首先还是想到它的嵌入式软核功能.如果能够基于Microblze软核进行C语言程序的开发,相对于使用 ...