Shell脚本比较两个网段是否存在包含与被包含的关系

设定两个网段:net1是192.168.10.0/24,net2是192.168.10.128/25。使用Shell脚本,判断是net1包含net2还是net2包含net1. 解题思路:
将两个网段全部转换为二进制,且不带字段分隔符(即点号),取网络位。如果在net1的二进制字符串里面截取到了net2的二进制字符串,则net2包含net1.

#!/bin/bash
net1="192.168.10.0/24"
net2="192.168.10.128/25"
netID1D="`echo $net1 | cut -d "/" -f 1`"
netID2D="`echo $net2 | cut -d "/" -f 1`"
mask1="`echo $net1 | cut -d "/" -f 2`"
mask2="`echo $net2 | cut -d "/" -f 2`"
array1D[0]="`echo $netID1D | awk -v FS="." ‘{print $1}‘`"
array1D[1]="`echo $netID1D | awk -v FS="." ‘{print $2}‘`"
array1D[2]="`echo $netID1D | awk -v FS="." ‘{print $3}‘`"
array1D[3]="`echo $netID1D | awk -v FS="." ‘{print $4}‘`"
array2D[0]="`echo $netID2D | awk -v FS="." ‘{print $1}‘`"
array2D[1]="`echo $netID2D | awk -v FS="." ‘{print $2}‘`"
array2D[2]="`echo $netID2D | awk -v FS="." ‘{print $3}‘`"
array2D[3]="`echo $netID2D | awk -v FS="." ‘{print $4}‘`"

array1B[0]="`echo "obase=2;${array1D[0]}" | bc`"
array1B[1]="`echo "obase=2;${array1D[1]}" | bc`"
array1B[2]="`echo "obase=2;${array1D[2]}" | bc`"
array1B[3]="`echo "obase=2;${array1D[3]}" | bc`"
array2B[0]="`echo "obase=2;${array2D[0]}" | bc`"
array2B[1]="`echo "obase=2;${array2D[1]}" | bc`"
array2B[2]="`echo "obase=2;${array2D[2]}" | bc`"
array2B[3]="`echo "obase=2;${array2D[3]}" | bc`"

zeroArray=(0 0 00 000 0000 00000 000000 0000000)
for ((i=0;i<${#array1B[$i]};i++))
do
        zeroNum=$((8 - ${#array1B[$i]}))
        if [ $zeroNum -gt 0 ]
        then
                testStr="`awk -v zero="${zeroArray[$zeroNum]}" -v rawStr="${array1B[$i]}" ‘BEGIN {printf "%s%s",zero,rawStr}‘`"
                array1B[$i]=$testStr
        fi
done

for ((i=0;i<${#array2B[$i]};i++))
do
    zeroNum=$((8 - ${#array2B[$i]}))
    if [ $zeroNum -gt 0 ]
    then
        testStr="`awk -v zero="${zeroArray[$zeroNum]}" -v rawStr="${array2B[$i]}" ‘BEGIN {printf "%s%s",zero,rawStr}‘`"
        array2B[$i]=$testStr
    fi
done

netID1B=${array1B[0]}${array1B[1]}${array1B[2]}${array1B[3]}
netID2B=${array2B[0]}${array2B[1]}${array2B[2]}${array2B[3]}
netID1BNo0="`awk -v inNet="$netID1B" -v inMask="$mask1" ‘BEGIN {print substr(inNet,1,inMask)}‘`"
netID2BNo0="`awk -v inNet="$netID2B" -v inMask="$mask2" ‘BEGIN {print substr(inNet,1,inMask)}‘`"
echo -e "net1十进制为:$net1\tnet1二进制为:$netID1BNo0"
echo -e "net2十进制为:$net2\tnet2二进制位:$netID2BNo0"
netVS1="`awk -v inNet1="$netID1BNo0" -v inNet2="$netID2BNo0" ‘BEGIN {print index(inNet1,inNet2)}‘`"
netVS2="`awk -v inNet2="$netID1BNo0" -v inNet1="$netID2BNo0" ‘BEGIN {print index(inNet1,inNet2)}‘`"
if [ $netVS1  -ne 0 ]
 then
  echo "计算结果:$net2 包含 $net1"
fi
if [ $netVS2 -ne 0 ]
  then
   echo "计算结果:$net1 包含 $net2"
fi

运行结果

[[email protected] ~]# sh netCal.sh
net1十进制为:192.168.10.0/24    net1二进制为:110000001010100000001010
net2十进制为:192.168.10.128/25  net2二进制位:1100000010101000000010101
计算结果:192.168.10.0/24 包含 192.168.10.128/25

原文地址:http://blog.51cto.com/qinlouke/2327303

时间: 2024-10-16 19:44:48

Shell脚本比较两个网段是否存在包含与被包含的关系的相关文章

2019.11.13课堂实验之用Linux下的shell脚本完成两文本交替输出

有两个文本如下,实际中并不知道两文本各有多少行: 文本1.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ccccccccccccccccccccccccccccccccccccccc eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ggggggggggggggggggggggggggggggggggggggg wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww zzzzzzzzzzzzzzzzz

shell脚本-比较两个整数大小

开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小.用条件表达式(禁止if)进行判断并以屏幕输出的方式提醒用户比较结果.注意:一共是开发2个脚本.当用脚本传参以及read读入的方式需要对变量是否为数字.并且传参个数不对给予提示. read读入方式 #!/bin/bash read -p "Pls input two num:" a b  #no1 [ -z "$a" ] || [ -z "$b" ] && 

shell 脚本---每隔几个小时查看日志文件中包含某些字符串的行数

在linux生产环境下,有如下这样的一个平常运维需要的工作. 每隔一段时间,比如两个小时,就要对每秒都要产生日志的日志文件(这里假设为testfile.out,其绝对路径为/home/panlm/shellpra/testfile.out)进行一个操作,这个操作是将日志中包含某些字符串的行给单独打印出来,并重新放在一个文件(这里的文件假设为out.log)中.这些需要匹配的字符串可以按这种方式表示"0x216000ab"其中ab为01到18的连续整数. 实现这样一个要求的做法主要有两步

用shell脚本 计算两个数的加减乘除取余

#! /bin/bash # read -p '请输入数:' a //输入 read -p '请输入数:' b echo '$a+$b=' $(( a + b )) //输出 echo '$a-$b=' $(( a - b )) echo '$a*$b=' $(( a * b )) echo '$a/$b=' $(( a / b )) echo '$a%$b=' $(( a % b ))

Shell 脚本《两个数求和》

#!/bin/bash #read -r使\取消转义功能 -p提示内容 read -r -p "Please input A: " A read -r -p "Then please input B: " B #$(( )) 比let更好, 注意 $(( )) 里面的变量不用$ sum=$(( A+B )) #printf 默认不会带回车行,echo则不一样 printf "A+B=%d" $sum 原文地址:http://blog.51cto.

shell脚本——日常练手

1.猜数小游戏 关键点:命令写法 1.$RANDOM 的使用格式 2.反引号 用于执行命令 3.let 整数自加1的用法 4.引用局部变量,${ }格式 5.elif 后面也要跟 ;then #!/bin/bash #*************猜数游戏************* i=0 #记录猜数次数 num2=`echo $RANDOM | cut -c 1-2` #目标数指定随机值 while true #死循环 do read -p "请输入两位整数:" num1 #输入竞猜初始

shell基础学习系列一:第一个shell脚本

打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行. 输入一些代码: #!/bin/bash echo "Hello World !" “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell.echo命令用于向窗口输出文本. 运行Shell脚本有两种方法. 作为可执行程序 将上面的代码保存为test.sh,并 cd 到相应目录: chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执

Shell脚本编程30分钟入门

什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch test_$i.txt done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到当前用户的home目录 第3行:创建一个目录shell_tut 第4行:切换到shell_tut目录 第5行:循环条件,一共循环10次 第6行:创建一个test_1…10.txt文件 第7

第一个Shell脚本

打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了. 输入一些代码: #!/bin/bash echo "Hello World!" “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell.echo命令用于向窗口输出文本. 运行Shell脚本有两种方法. 作为可执行程序 将上面的代码保存为test.sh,并 cd 到相应目录: chmod +x