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内置函数比特操作部分内容,这里给出每个函数简单操作!
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
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
如下图为本人编写的一个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