bashipipv4netmask

Bash script to calculate summarize IP address ranges


I need to write a bash script that when I enter two ip addresses, it will calculate summarize address for them.

Examlpe:

192.168.1.27/25
192.168.1.129/25  

Result will be:

192.168.1.0/24  

Can you help me with this script?

I know you will say to me “What did you try?”

I tried to find something in Google, but what I found that I must to convert to binary then calculate it, and it will be very hard.

I even don’t know how to start with it.

Any idea or hint please?


Solution

  • Calculation of common netmask with bash:

    #!/bin/bash
    
    D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
    declare -i c=0                              # set integer attribute
    
    # read and convert IPs to binary
    IFS=./ read -r -p "IP 1: " a1 a2 a3 a4     # e.g. 192.168.1.27
    b1="${D2B[$a1]}${D2B[$a2]}${D2B[$a3]}${D2B[$a4]}"
    
    IFS=./ read -r -p "IP 2: " a1 a2 a3 a4     # e.g. 192.168.1.129
    b2="${D2B[$a1]}${D2B[$a2]}${D2B[$a3]}${D2B[$a4]}"
    
    # find number of same bits ($c) in both IPs from left, use $c as counter
    for ((i=0;i<32;i++)); do
      [[ ${b1:$i:1} == "${b2:$i:1}" ]] && c=c+1 || break
    done    
    
    # create string with zeros
    for ((i=c;i<32;i++)); do
      fill="${fill}0"
    done    
    
    # append string with zeros to string with identical bits to fill 32 bit again
    new="${b1:0:$c}${fill}"
    
    # convert binary $new to decimal IP with netmask
    new="$((2#${new:0:8})).$((2#${new:8:8})).$((2#${new:16:8})).$((2#${new:24:8}))/$c"
    echo "$new"
    

    Output:

    192.168.1.0/24