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