linux shell 如何把1.0.32.0/19 这个IP 段的IP 输出来呢?

1.0.32.0/19 这个IP 段的范围是 1.0.32.1 - 1.0.63.254
1.1.0.0/24 这个IP 段的范围是 1.1.0.1 - 1.1.0.254

我就想把 1.0.32.0/19 这里边的IP 像以下格式一行行输出来
1.0.32.1
1.0.32.2
1.0.32.3
1.0.32.4
………………
1.0.63.254

这里边用shell 实现,用sipcalc 可以计算出 1.0.32.0/19 它的范围,但无法一个个IP 输出来,有没有网友帮助下?谢谢。
补充:
看了两位网友的回复,真的是非常感谢,但是这里有一个问题,我没有说清楚。我并不是想处理一两个IP ,而是处理很多。

在linux 下的一个文件 ip.txt 里边保存了很多IP段,我想都处理,这个shell 该如何实现 ?

ip.txt

1.0.32.0/19
1.0.1.0/24
1.0.2.0/23
1.0.8.0/21
1.1.0.0/24
1.1.2.0/23
1.1.4.0/22
1.1.8.0/21
1.1.16.0/20
1.1.32.0/19
1.2.0.0/23
1.2.5.0/24
1.2.6.0/23
1.2.9.0/24
1.2.10.0/23
1.2.12.0/22
1.2.16.0/20
1.2.32.0/19
1.2.64.0/18
1.3.0.0/16
1.4.1.0/24
1.10.32.0/19

里边有这么多内容,如何把它们转换成一个个IP 输出来呢?

#!/bin/bash
#脚本名称:test.sh
#使用方法:./test.sh ip.txt
#备注:自动生成以IP范围命名的.txt文件
while read IPRANGE
do
    IP_FILE_NAME=$(echo $IPRANGE | cut -d/ -f1)
    IP_1="$(echo $IPRANGE | cut -d"." -f1-2)."
    IP_3="$(echo $IPRANGE | cut -d"." -f3)"
    MAX_IP_3="$(sipcalc $IPRANGE | awk -F. '/Usable range/{print $6}')"
    for i in $(seq $IP_3 $MAX_IP_3)
    do
        for j in $(seq 1 254)
            do
                touch $IP_FILE_NAME.txt
                echo "${IP_1}${i}.${j}" >>$IP_FILE_NAME.txt
            done
    done
done < $1

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-31

python版:

#!/usr/bin/env python

def ip2num(ip):
    ip3, ip2, ip1, ip0 = ip.split('.')
    return int(ip3) << 24 | int(ip2) << 16 | int(ip1) << 8 | int(ip0)

def num2ip(num):
    return '%s.%s.%s.%s' % (num >> 24 & 0xff, num >> 16 & 0xff,
                            num >> 8 & 0xff, num & 0xff)

network = '1.0.32.0'
mask = 19
write_able = 32 - mask
start = (ip2num(network) >> write_able) << write_able

i = 0
while i < 2 ** write_able - 1:
    i += 1
    print num2ip(start+i)

 

第2个回答  2013-10-31
#!/bin/ksh
#输出来是什么意思?打印到屏幕上?
for((i=1;i<=63;i++))
do
   for((x=1;x<=254;x++))
   do
      echo "1.0."$i"."$x
   done
done

#have a try dude...

追问

在linux 下的一个文件  ip.txt 里边保存了很多IP段,我想都处理,这个shell 该如何实现 ?


ip.txt


1.0.32.0/19

1.0.1.0/24

1.0.2.0/23

1.4.1.0/24

1.10.32.0/19


里边有这么多内容,如何把它们转换成一个个IP 输出来呢?

sipcalc 这个命令,可以查出每一个IP段的范围。

追答#ip.txt里面是什么样的?
more  ip.txt  #打印出来看看
#另外,你是想从ip.txt这个文件里把IP地址都提取出来,做其他处理吗,还是要怎样?

追问


想从ip.txt这个文件里把IP地址都提取出来,ip.txt文件里,都是以段的形式保存IP 的,我是想把它转换成一个个IP 输出来,就像输出来的结果如下:

1.0.32.1
1.0.32.2
1.0.32.3
1.0.32.4
………………
1.0.63.254

追答#!/bin/bash
#by don2ccc
#新鲜出炉,不用谢
LIST=`cat ip.txt`
for line in $LIST
do
  #echo $line  #DEBUG
  idxA=`echo $line|awk -F"." '{print $4}'|awk -F"/" '{print $1}'`
  idxB=`echo $line|awk -F"." '{print $4}'|awk -F"/" '{print $2}'`
  current_ip_range=`echo $line|awk -F"." '{print $1"."$2"."$3"."}'`
  for((x=$idxA;x<=idxB;x++))
  do
    echo $current_ip_range$x
  done

done


#这个shell以后你的ip.txt里面,只要格式不变,不管他添加多少新的进来都OK.

追问

说实在话,不行哦。。

例如你反一个IP 段放到 ip.txt 里测试下,

ip.txt 

内容
1.0.1.0/24



追答#1.0.1.0/24
#比如这个,你想要啥样的结果?
shell是很灵活的,你完全可以根据给你的循环结构,自己去改它的循环次数,来达到你自己想要的效果嘛。

本回答被提问者采纳
相似回答