Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3023835
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-10-24 13:36:59

文本:
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


  1. awk 'BEGIN{FS=",";ip_max=256}
  2.          {
  3.          split($2,ips,".");split($3,ipe,".");
  4.          for(i=ips[4]+ips[3]*ip_max+ips[2]*ip_max^2+ips[1]*ip_max^3;
  5.              i<=ipe[4]+ipe[3]*ip_max+ipe[2]*ip_max^2+ipe[1]*ip_max^3;
  6.              i++){
  7.                   print int(i/ip_max^3)"."\
  8.                         int(i%ip_max^3/ip_max^2)"."\
  9.                         int(i%ip_max^3%ip_max^2/ip_max)"."\
  10.                         i%ip_max^3%ip_max^2%ip_max
  11.                  }
  12.           }' 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。然后打印。



  1. awk -F, -vk=256 'function ip(ips,ipe){
  2.                                       split(ips,s,".");split(ipe,e,".");
  3.                                       eip=((e[1]*k+e[2])*k+e[3])*k+e[4];
  4.                                       while(((s[1]*k+s[2])*k+s[3])*k+s[4]<=eip){
  5.                                          print s[1]"."s[2]"."s[3]"."s[4];
  6.                                             for(n=4;n>0;n--){
  7.                                                s[n]++;if(s[n]>=256)s[n]=1;else n=0
  8.                                             }
  9.                                          }
  10.                                      }
  11.                 {ip($2,$3)}' file
[解析]
这个语句的原理也是一样的,把结束点的IP换算成10进制,然后检查每个IP位超过256了就设置为1。


如果打印 192.168.0.0 - 192.168.2.255 下面的方法是个不错的办法。

  1. for i in 192.168.{0..2}.{0..255};do echo $i;done





  1. echo "00:00:27:1d:01:ff"|awk -F":" '
  2.     BEGIN{hex=256}
  3.     function dtoh(i){return strtonum("0x"i)}
  4.     {mac=dtoh($1)*hex^5+dtoh($2)*hex^4+dtoh($3)*hex^3+dtoh($4)*hex^2+dtoh($5)*hex+dtoh($6);
  5.     mac++;
  6.     printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
  7.         int(mac/hex^5),
  8.         int(mac%hex^5/hex^4),
  9.         int(mac%hex^5%hex^4/hex^3),
  10.         int(mac%hex^5%hex^4%hex^3/hex^2),
  11.         int(mac%hex^5%hex^4%hex^3%hex^2/hex),
  12.         mac%hex^5%hex^4%hex^3%hex^2%hex)}
[解析]
输入一个MAC地址,自动计算递增一位.





阅读(5449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~