文本:test1,10.10.10.3,10.10.10.5
test2,10.10.10.253,10.10.11.2
要求打印出2个IP之间的IP地址:
10.10.10.3
10.10.10.4
10.10.10.5
10.10.10.253
10.10.10.254
10.10.10.255
10.10.11.0
10.10.11.1
10.10.11.2
- awk 'BEGIN{FS=",";ip_max=256}
-
{
-
split($2,ips,".");split($3,ipe,".");
-
for(i=ips[4]+ips[3]*ip_max+ips[2]*ip_max^2+ips[1]*ip_max^3;
- i<=ipe[4]+ipe[3]*ip_max+ipe[2]*ip_max^2+ipe[1]*ip_max^3;
- i++){
- print int(i/ip_max^3)"."\
- int(i%ip_max^3/ip_max^2)"."\
- int(i%ip_max^3%ip_max^2/ip_max)"."\
- i%ip_max^3%ip_max^2%ip_max
-
}
- }' file
[解析]
IP换算一直是个头疼的问题啊,今天彻底把它给理清楚吧,文本提供的数据呢,是第2个字段的IP作为起始点,第3个字段的IP作为结束点,要求打印出这2个点之间的IP地址,这就涉及到IP的换算问题,大家都知道IP相当于是256进制的换算,满了256才进1,跟0-9一共10位满了10为就进1是一个道理。
理清楚思路后,把第2、3字段用 . 分割成数组,用for循环,i变量的起点就是比如IP 10.10.10.3,就换算为 3+10*256+10*256*256+10*256*256*256,^ 就是一个幂运算符,256^3 就等于是 256*256*256,然后换算好IP的终点,这样i自增,然后再把自增过的IP地址,又换算为IP地址,把i对256的3次方相除取整就得到了第一位IP,把i对256的3次方取余后再除以256的2次方的结果取整得到第二位IP,把i对256的3次方取余的结果再对256的2次方取余的结果再除以256取整,得到第3位IP,最后全部取余,得到最后的余数就是第4位IP。然后打印。
- awk -F, -vk=256 'function ip(ips,ipe){
- split(ips,s,".");split(ipe,e,".");
- eip=((e[1]*k+e[2])*k+e[3])*k+e[4];
- while(((s[1]*k+s[2])*k+s[3])*k+s[4]<=eip){
- print s[1]"."s[2]"."s[3]"."s[4];
- for(n=4;n>0;n--){
- s[n]++;if(s[n]>=256)s[n]=1;else n=0
-
}
- }
- }
-
{ip($2,$3)}' file
[解析]
这个语句的原理也是一样的,把结束点的IP换算成10进制,然后检查每个IP位超过256了就设置为1。
如果打印 192.168.0.0 - 192.168.2.255 下面的方法是个不错的办法。
- for i in 192.168.{0..2}.{0..255};do echo $i;done
- echo "00:00:27:1d:01:ff"|awk -F":" '
- BEGIN{hex=256}
- function dtoh(i){return strtonum("0x"i)}
- {mac=dtoh($1)*hex^5+dtoh($2)*hex^4+dtoh($3)*hex^3+dtoh($4)*hex^2+dtoh($5)*hex+dtoh($6);
- mac++;
- printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
- int(mac/hex^5),
- int(mac%hex^5/hex^4),
- int(mac%hex^5%hex^4/hex^3),
- int(mac%hex^5%hex^4%hex^3/hex^2),
- int(mac%hex^5%hex^4%hex^3%hex^2/hex),
- mac%hex^5%hex^4%hex^3%hex^2%hex)}
[解析] 输入一个MAC地址,自动计算递增一位.
阅读(5457) | 评论(0) | 转发(0) |