awk实战8-函数系列-字节操作

awk一个神奇而又强大的功能,绝对是一个开发利器,效率直选!希望这里的一些总结能帮到那些存在困惑的人!

awk实战1-基础语法说明

awk实战2-流程控制语句总结

awk实战3-awk数组技巧

awk实战4-函数系列-算数函数说明

awk实战5-函数系列-基本字符串函数

awk实战6-函数系列-字符串函数说明-asort和sub

awk实战7-函数系列-时间函数

awk实战8-函数系列-字节操作

awk实战9-IO函数-getline和close

awk实战10-IO函数-其他介绍

awk实战11-进阶-10种awk有效应用实战

awk实战12-进阶-再谈awk匹配模式

awk处理小问题-解决局部jar包替换

awk比特内置函数介绍

本节主要介绍awk内置函数比特操作部分内容,这里给出每个函数简单操作!

1 位移函数lshift和rshift-关注指数:☆☆☆☆

lshift(val, count) - 左移位数

rshift(val, count) - 右移位数

user@user:~$ awk 'BEGIN{i=1;y=lshift(i,2);print i,y}'
1 4
user@user:~$ awk 'BEGIN{i=1;y=lshift(i,4);print i,y}'
1 16
user@user:~$ awk 'BEGIN{i=8;y=rshift(i,4);print i,y}'
8 0
user@user:~$ awk 'BEGIN{i=8;y=rshift(i,2);print i,y}'
8 2
user@user:~$ awk 'BEGIN{i="8";y=rshift(i,2);print i,y}'
8 2
user@user:~$ awk 'BEGIN{i="8";y=rshift(i,"2");print i,y}'
8 2
user@user:~$ awk 'BEGIN{i="8";y=rshift(i,"3");print i,y}'
8 1

2 与或非函数-关注指数:☆☆☆☆☆

and(v1, v2 [, …]) 与操作

与操作是我们进行掩码运算的一个非常有用的工具,其支持10进制和16进制的操作,特别是ovs查看流表等操作中,能非常快得到结果,便于我们平时开发中快速确认掩码!极力推荐!

user@user:~$ awk 'BEGIN{x=0x138a000000;y=0xffff000000;z=and(x,y);printf("%x\n%x\n%x\n",x,y,z)}'
138a000000
ffff000000
138a000000
-------------------------------------------------
user@user:~$ awk 'BEGIN{x=15;y=10;z=and(x,y);printf("%x\n%x\n%x\n",x,y,z)}'
f
a
a
user@user:~$ 
-------------------------------------------------
user@user:~$ awk 'BEGIN{x=0xf;y=0xa;z=and(x,y);printf("%x\n%x\n%x\n",x,y,z)}'
f
a
a

or(v1, v2 [, …]) 或操作

user@user:~$ awk 'BEGIN{x=0xf;y=0xa;z=or(x,y);printf("%x\n%x\n%x\n",x,y,z)}'
f
a
f

xor(v1, v2 [, …]) 异或操作

user@user:~$ awk 'BEGIN{x=0xf;y=0xa;z=xor(x,y);printf("%x\n%x\n%x\n",x,y,z)}'
f
a
5

compl(val) 取补码

user@user:~$ awk 'BEGIN{x=0xf;y=compl(x);printf("%x\n%x\n",x,y)}'
f
1ffffffffffff0

这里值得提醒的是所有的按位操作函数都是支持字符串和数字的,但是如果字符串是十六进制形式,则不支持进行逻辑操作------为解决这个问题,我们通常取字符串转换成数字函数,进行数字转换,以解决字符串十六进制无法识别的问题;

如下所示命令,因为十六进制是字符串形式, 因此并不能正确获得按位操作结果:

user@host-1 19:38:~$ awk 'BEGIN{x="0xf";y="0xa";z=and(x,y);printf("%x\n%x\n%x\n",x,y,z)}'
0
0
0
user@host-1 19:38:~$ awk 'BEGIN{x="0xf";y="0xa";z=and(x,y);printf("%x\n%x\n%x\n",x,y,z)}'
0
0
0

3 掩码运算脚本演示–关注指数:☆☆☆☆☆

如下图为本人编写的一个show-metadata的简单脚本,可以看到由于入参为十六进制字符串,程序在split分解得到两个子字符串后,先使用strtonum将字符串转换成了数字,在进行与操作!

show-metadata脚本内容:

#!/usr/bin/env bash
awk -v var=$1 'BEGIN{
  split(var,a,"/");
  x=strtonum(a[1]);
  y=strtonum(a[2]);
  printf("-- %x\n-- %x\n",x,y);
  z=and(x,y);
  printf("++ %x\n",z)'

show-metadata运行结果

user@user☆ :~/bin$ show-metadata 0x50000000000/0xffffff0000000000
-- 50000000000
-- ffffff0000000000
++ 50000000000
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值