如何利用bash/python计算IP子网容纳计算机数量
2013-09-04 14:03
399 查看
知道子网的IP和NETMASK,计算出这个子网可以包含多少台计算机?
1. 子网IP,NETMASK,子网广播IP。子网容量。
知道这三个钟任意两个,都可以得到第三个值,知道这三个值,就可以知道第四个了。例如:192.168.1.22/25。前面是子网IP地址,25是子网掩码,得到所以把22换算成二进制(00010110),其中第一位被分到网络地址里了。剩下的位数改为1,即为子网广播地址(192.168.1.127)。22~127之间且不包括两边值得数量就是计算机数量了。
2. bc对十进制和二进制进行。二进制结果如果不足八位左边补0(IP要求)
[huang@huang ~]$ echo 'obase=2; 22'| bc
10110
[huang@huang ~]$ echo 'ibase=2; 111'| bc
7
注意:这里不必再加ibase=10/obase=10,因为系统默认ibase,obase都是十进制。否则会出错!
3. python也可以达到相同功能。使用内置函数int(),bin(),python -c 把二进制和十进制换算。但是要注意bin(),返回前两个字节是0b,和输出结果没有关系。所以最好剔除。
[huang@huang ~]$ python -c "print int('01111111',2);"
127
[huang@huang ~]$ python -c 'print bin(22)'| cut -d'b'-f2
10110
4. 用bash写的一个的脚本实例:
#!/bin/bash
# return the number of PC in subnet according to subnet IP and NETMASK
# sample: 192.168.1.22/26
# check the format of $1
usage(){
echo 'format 192.168.1.1/25'
exit 1
}
# check param
if ["$#"== 0 ];then
usage
elif ["$#"== 1 ];then
echo $1 | grep -qxP '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{2}'|| usage
else
usage
fi
# calculate the number of PC the subnet can contain
nmask=`echo $1 | cut -d\/-f2`
nip=`echo $1 | cut -d\/-f1`
# convert 10 base to 2 base
nbin=''
fori in `echo $nip | cut -d.-f1,2,3,4 --output-delimiter=' '`
do
ip_part_bin=`echo "obase=2;$i"| bc |tr-d '\n'`
num=`echo -n $ip_part_bin | wc -c`
# add 0 if the count of ip_part is less than 8
if ["$num"-lt 8 ];then
let theless=8-"$num"
while ["$num"-lt 8 ]
do
ip_part_bin=`echo -n "$ip_part_bin"| sed 's/^/0/'`
let num+=1
done
fi
nbin+="$ip_part_bin"
done
echo $nbin
输出值是:
[nanhuang@nanhuang ~]$ bash binaryip.sh '10.10.10.0/26'
00001010000010100000101000000000
1. 子网IP,NETMASK,子网广播IP。子网容量。
知道这三个钟任意两个,都可以得到第三个值,知道这三个值,就可以知道第四个了。例如:192.168.1.22/25。前面是子网IP地址,25是子网掩码,得到所以把22换算成二进制(00010110),其中第一位被分到网络地址里了。剩下的位数改为1,即为子网广播地址(192.168.1.127)。22~127之间且不包括两边值得数量就是计算机数量了。
2. bc对十进制和二进制进行。二进制结果如果不足八位左边补0(IP要求)
[huang@huang ~]$ echo 'obase=2; 22'| bc
10110
[huang@huang ~]$ echo 'ibase=2; 111'| bc
7
注意:这里不必再加ibase=10/obase=10,因为系统默认ibase,obase都是十进制。否则会出错!
3. python也可以达到相同功能。使用内置函数int(),bin(),python -c 把二进制和十进制换算。但是要注意bin(),返回前两个字节是0b,和输出结果没有关系。所以最好剔除。
[huang@huang ~]$ python -c "print int('01111111',2);"
127
[huang@huang ~]$ python -c 'print bin(22)'| cut -d'b'-f2
10110
4. 用bash写的一个的脚本实例:
#!/bin/bash
# return the number of PC in subnet according to subnet IP and NETMASK
# sample: 192.168.1.22/26
# check the format of $1
usage(){
echo 'format 192.168.1.1/25'
exit 1
}
# check param
if ["$#"== 0 ];then
usage
elif ["$#"== 1 ];then
echo $1 | grep -qxP '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{2}'|| usage
else
usage
fi
# calculate the number of PC the subnet can contain
nmask=`echo $1 | cut -d\/-f2`
nip=`echo $1 | cut -d\/-f1`
# convert 10 base to 2 base
nbin=''
fori in `echo $nip | cut -d.-f1,2,3,4 --output-delimiter=' '`
do
ip_part_bin=`echo "obase=2;$i"| bc |tr-d '\n'`
num=`echo -n $ip_part_bin | wc -c`
# add 0 if the count of ip_part is less than 8
if ["$num"-lt 8 ];then
let theless=8-"$num"
while ["$num"-lt 8 ]
do
ip_part_bin=`echo -n "$ip_part_bin"| sed 's/^/0/'`
let num+=1
done
fi
nbin+="$ip_part_bin"
done
echo $nbin
输出值是:
[nanhuang@nanhuang ~]$ bash binaryip.sh '10.10.10.0/26'
00001010000010100000101000000000
相关文章推荐
- Python 利用字典计算数据中不重复的数量
- ex的DateChooser控件中如何利用selectableRange属性计算选中两个日期间天数的例子
- [Python Tip]如何计算时间差
- 如何利用Python库urllib2获取百度搜索引擎加密链接
- 如何象计算机专家一样思考:学习Python --序
- 如何象计算机专家一样思考:学习Python--第一章
- 如何利用python生成随机验证码?
- 利用Python如何将数据写到CSV文件中
- #####带时间衰减因子#####应用实战: 如何利用Spark集群计算物品相似度
- python利用标准库如何获取本地IP示例详解
- 如何利用python把文章到数组中存储等待处理
- 如何利用python+mySQL写个数据库并且利用python将所需变量值写入数据库
- 如何利用python使用libsvm
- 如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx
- 如何利用RMAN将数据库备份到其他计算机的硬盘上
- 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
- 如何利用深度学习写诗歌(使用Python进行文本生成)
- ArcGIS--如何计算落在每个多边形内的点的数量?
- 利用Python如何制作好玩的GIF动图详解
- python--利用datetime模块计算时间差