Требуется:
1. Открыть файл №1 - в нем узнать какие есть подсети (пулы) с маской, по маске определить какое количество IP адресов в ней может быть.
2. Открыть файл №2 - подсчитать количество IP адресов в каждой подсети - занятые IP адреса.
3. Итог: узнать количество занятых IP адресов в подсети, а также IP адреса которые не заняты.
Честно сказать задача очень интересна, но пока мои познания в баше очень-очень скромны.
# Простейшая проверка на правильность запуска скрипта
if [ $# -ne 2 ]; then
echo "Usage: `basename $0` <subnets_file> <leases_file>"
exit 255
fi
# Начинаем считывать данные из файла с подсетями
while read _pool;
do
# Далее получаем нужные данные
subnet=$(echo "${_pool}" | awk '{print $2"/"$4}') # приводим к "правильному" виду подсеть
declare -i ip_total=$(ipcalc ${subnet} | grep -i "hosts/net" | awk '{print $2}') # количество адресов в подсети
declare -i ip_first=$(ipcalc ${subnet} | grep -i "hostmin" | awk '{print $3$4}' | sed 's/\.//g') # начальный адрес в двоичной форме
declare -i ip_last=$(ipcalc ${subnet} | grep -i "hostmax" | awk '{print $3$4}' | sed 's/\.//g') # конечный адрес в двоичной форме
declare -i ip_leased=0 # задаем начальное значение счетчику выданных адресов
# Начинаем считывать данные из файла с выданными адресами
while read _lease;
do
# Приводим адрес к двоичному виду, чтобы сравнить его с начальным и конечным
declare -i ip_addr=$(echo "${_lease}" | awk '{print $2}' | xargs ipcalc | grep -i "address" | awk '{print $3$4}' | sed 's/\.//g')
# Собственно сравнение. Если адрес входит в диапазон адресов подсети, увеличиваем счетчик на единицу
if [ ${ip_addr} -ge ${ip_first} -a ${ip_addr} -le ${ip_last} ]; then
ip_leased=${ip_leased}+1
fi
done < "${leases_file}"
# Вычисляем количество свободных адресов
ip_free=$((${ip_total}-${ip_leased}))
# Выдаем полученную информацию на экран
echo "Subnet ${subnet}: total ${ip_total}, leased ${ip_leased}, free ${ip_free}"
done < "${subnet_file}"
А вот как он отработал на ваших файлах:
text
$ ./free_ips.sh file1.txt file2.txt
Subnet 10.0.0.2/255.255.255.0: total 254, leased 3, free 251
Subnet 192.168.10.2/255.255.255.0: total 254, leased 3, free 251
Subnet 172.16.10.2/255.255.255.0: total 254, leased 3, free 251
По поводу "грязности" скрипта: во-первых, для своей работы он требует grep, awk и sed, а главное - пакет ipcalc, а во-вторых, утилита ipcalc из пакета initscripts в CentOS не подойдет. Но это в целом не беда, скрипт можно будет доделать так, чтобы он смог работать с обоими вариантами ipcalc, а также и с sipcalc. Пока же попробуйте его у себя и сообщите об ошибках, буде таковые возникнут.
Не-не-не, ничего минусовать не надо. Тут у вопрошающего немного необычно адреса подсетей заданы - правильнее было бы не 10.0.0.2, а 10.0.0.0 и так далее. А вообще задача не особо трудная и творческая - просто определить принадлежность конкретного IP-адреса той или иной подсети. В Perl'е для этой задачи применяется модуль Net::IP::RangeCompare. Ну, а в shell-скриптах я как-то больше привык ipcalc использовать.