преобразования списка подсетей IPv4 из краткого формата (CIDR) в полный формат
Добавлено: 15 дек 2024, 01:08
преобразования списка подсетей IPv4 из краткого формата (CIDR) в полный формат
Скрипт сначала считает общее количество строк в входном файле с помощью команды wc -l, затем обрабатывает каждую строку, обновляя прогресс.
Прогресс бар обновляется в строке терминала, что позволяет избежать создания лишних строк вывода.
%d — это процент, который рассчитывается на основе количества обработанных строк относительно общего количества строк.
Если вы хотите увидеть прогресс сразу, когда скрипт запускается, можно добавить вывод общего количества строк перед началом цикла, если это необходимо.
cidr_to_ips_with_progress.sh
выставляем права доступа на выполнение
запуск скрипта с входным и выходным файлом
Код: Выделить всё
xxx.xxx.xxx.xxx/xx -> xxx.xxx.xxx.xxx/xxx.xxx.xxx.xxx
Прогресс бар обновляется в строке терминала, что позволяет избежать создания лишних строк вывода.
%d — это процент, который рассчитывается на основе количества обработанных строк относительно общего количества строк.
Если вы хотите увидеть прогресс сразу, когда скрипт запускается, можно добавить вывод общего количества строк перед началом цикла, если это необходимо.
Код: Выделить всё
sudo apt-get install ipcalc original-awk
Код: Выделить всё
#!/bin/bash
# Проверяем, что переданы два аргумента: входной и выходной файл
if [ "$#" -ne 2 ]; then
echo "Использование: $0 <входной файл> <выходной файл>"
exit 1
fi
input_file="$1"
output_file="$2"
# Функция для преобразования CIDR в полный формат сети
#cidr_to_full() {
# local cidr="$1"
#
# # Получаем базовый IP и маску
# IFS='/' read -r base mask <<< "$cidr"
# IFS='.' read -r i1 i2 i3 i4 <<< "$base"
#
# # Вычисляем базовый IP в десятичном формате
# local base_num=$(( (i1 << 24) + (i2 << 16) + (i3 << 8) + i4 ))
#
# # Количество IP в сети
# local num_ips=$(( 1 << (32 - mask) ))
#
# # Находим последний IP в сети
# local last_ip_num=$(( base_num + num_ips - 1 ))
#
# # Преобразуем базовый и последний IP в нужный формат
# printf "%d.%d.%d.%d/%d.%d.%d.%d\n" \
# "$(( (base_num >> 24) & 255 ))" "$(( (base_num >> 16) & 255 ))" "$(( (base_num >> 8) & 255 ))" "$(( base_num & 255 ))" \
# "$(( (last_ip_num >> 24) & 255 ))" "$(( (last_ip_num >> 16) & 255 ))" "$(( (last_ip_num >> 8) & 255 ))" "$(( last_ip_num & 255 ))"
#
#}
cidr_to_full_mask() {
# local cidr="$1"
#
# # Получаем маску
# IFS='/' read -r base mask <<< "$cidr"
#
# # Вычисляем полную маску подсети
# local full_mask=$(( 0xFFFFFFFF ^ ((1 << (32 - mask)) - 1) ))
local mask="$1"
# Устанавливаем полный адрес маски
local full_mask=0
if (( mask == 0 )); then
full_mask=0
else
full_mask=$(( 0xFFFFFFFF ^ ((1 << (32 - mask)) - 1) ))
fi
# Преобразуем маску в 4 октета
local m1=$(( (full_mask >> 24) & 255 ))
local m2=$(( (full_mask >> 16) & 255 ))
local m3=$(( (full_mask >> 8) & 255 ))
local m4=$(( full_mask & 255 ))
# # Форматируем вывод
# echo "$cidr/$m1.$m2.$m3.$m4"
# Возвращаем полную маску
echo "$m1.$m2.$m3.$m4"
}
# Получаем количество строк в входном файле
total_lines=$(wc -l < "$input_file")
processed_lines=0
# Открываем выходной файл для записи и очищаем его
> "$output_file"
# Читаем файл построчно и обрабатываем каждый CIDR
while read -r line; do
# Игнорируем пустые строки и комментарии
[[ -z "$line" || "$line" =~ ^# ]] && continue
# cidr_to_full "$line" >> "$output_file"
# Разделяем строку на IP и маску
IFS='/' read -r ip mask <<< "$line"
# Получаем полную маску
full_mask=$(cidr_to_full_mask "$mask")
# Записываем в выходной файл нужный формат
echo "$ip/$full_mask" >> "$output_file"
# Обновляем счетчик обработанных строк
((processed_lines++))
# Вычисляем процент выполненной работы
percent=$(( (processed_lines * 100) / total_lines ))
# Выводим прогресс-бар
printf "\rПрогресс: [%-100s] %d%%" "$(printf "%-${percent}s" "=" | tr ' ' '=')" "$percent"
done < "$input_file"
echo -e "\nПреобразование завершено. Результат сохранён в '$output_file'."
exit 0
Код: Выделить всё
chmod +x cidr_to_ips_with_progress.sh
Код: Выделить всё
./cidr_to_ips_with_progress.sh входной_файл.txt выходной_файл.txt