Chinaunix

标题: long转ip [打印本页]

作者: Arthur_    时间: 2013-08-25 13:29
标题: long转ip
  1. 0000-00-00 00:00:00     2013-08-25 00:14:39     17      1256256222      4288861521      0       43095   4655    0
  2. 0000-00-00 00:00:00     2013-08-25 00:15:23     6       1256256222      4288588468      0       12069   10778   0
复制代码
其中我想把第6和第7列转成IP地址其它不变, 如何做,我搜到 一个转 ip的 shell:

function long2IP(){
  local IP=$1
  local NET=
  NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  (( IP >>= 8 ))
  NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  (( IP >>= 8 ))
  NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  (( IP >>= 8 ))
  NET="${IP}${NET}"
  echo $NET
}


但是怎么也想不出怎么换。
作者: liion631818    时间: 2013-08-25 13:36
本帖最后由 liion631818 于 2013-08-25 15:09 编辑

不好转,22222,222.22 22.222怎么判断??
下面的代码是前面的ip尽可能的长

  1. awk '{
  2.         len=length($0);
  3.         if(len>12||len<4)
  4.                 next;
  5.         s = 1;
  6.         dot="."
  7.                 cnt=3
  8.                 e = 3
  9.         while(1)
  10.         {
  11.             if(cnt==-1)
  12.                                 break;
  13.             if(cnt==0)
  14.                 dot=""
  15.                         if(len-s-e<cnt-1)
  16.                         {
  17.                                 e--;
  18.                                 continue;
  19.                         }
  20.             ip = substr($0, s, e);
  21.             if( strtonum(ip) <= 255 )
  22.             {
  23.                 printf ip dot
  24.                                 cnt--
  25.                                 s=s+e
  26.                                 e=3
  27.             }
  28.             else
  29.             {
  30.                     e--
  31.             }
  32.                
  33.         }
  34.         printf "\n"
  35. }' 1.txt
复制代码

作者: chenxing0407    时间: 2013-08-26 00:25
ip&0xff000000 ip&0x00ff0000 ip&0x0000ff00 ip&0xff
作者: chenxing0407    时间: 2013-08-26 00:30
  1. 从openwrt /usr/lib/common.awk 看到的
  2. function ip2int(ip) {
  3.         for (ret=0,n=split(ip,a,"\."),x=1;x<=n;x++) ret=or(lshift(ret,8),a[x])
  4.         return ret
  5. }

  6. function int2ip(ip,ret,x) {
  7.         ret=and(ip,255)
  8.         ip=rshift(ip,8)
  9.         for(;x<3;ret=and(ip,255)"."ret,ip=rshift(ip,8),x++);
  10.         return ret
  11. }
复制代码

作者: zooyo    时间: 2013-08-26 10:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: zooyo    时间: 2013-08-26 10:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: zooyo    时间: 2013-08-26 10:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: liion631818    时间: 2013-08-26 13:09
回复 7# zooyo


    唉,被你发现了,就是好久没搞了又来练练手咯。
工作完全接触不到这个
作者: expert1    时间: 2013-08-26 13:18
回复 1# Arthur_


    awk写个自定义函数

function l2ip(n) {
return int(n/256^3)"."int(n%256^3/256^2)"."int(n%256^2/256)"."int(n%256) }

作者: liion631818    时间: 2013-08-26 13:52
回复 6# zooyo


    原来ip和数值之间是这么转换的啊,把它当字符串了。理解严重偏差。学习下:

  1. function IP2Long(){
  2.         local LNET=0
  3.         IFS="."
  4.         local IP=( $1 )
  5.         (( LNET=(${IP[0]}<<24)|(${IP[1]}<<16)|(${IP[2]}<<8)|(${IP[3]}) ))
  6.         echo $LNET

  7. }
复制代码

作者: zooyo    时间: 2013-08-26 15:03
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2