#bash #shell #ip #range
#bash #оболочка #ip #диапазон
Вопрос:
Мне нужен bash
код для генерации ДИАПАЗОНА заданных IP-адресов. Например, если у меня есть следующий простой список:
1.1.1.1
1.1.1.2
1.1.1.3
1.1.1.5
1.1.2.1
1.2.3.4
100.100.1.2
100.100.1.3
Мой вывод будет:
(1.1.1.1-1.1.1.3)
1.1.1.5
1.1.2.1
1.2.3.4
(100.100.1.2-100.100.1.3)
… и так далее.
В диапазон будут включены ТОЛЬКО ближайшие IP-адреса.
Комментарии:
1. Если вы хотите использовать его для bash, вам, вероятно, следует пометить его. Кроме того, зачем нужен makefile? Используйте
{}
в редакторе для разметки данных — и код, который вы пробовали до сих пор. Спасибо.
Ответ №1:
Хотя это, безусловно, возможно написать в bash, охватить все угловые случаи довольно сложно. Можете ли вы установить специальный инструмент для этой задачи, например iprange
?
iprange -j
результат очень близок к тому, что вам нужно, и вы можете исключить одноэлементные диапазоны следующим образом:
iprange -j | sed 's/^(.*)-1$/1/'
Комментарии:
1. спасибо за ответ, нет, я не могу установить внешние инструменты
Ответ №2:
Это решение внутри GNUmake, использующее gmtt, библиотеку для программирования общего назначения в GNUmake.
include gmtt-master/gmtt-master/gmtt.mk
ip-inc = $(strip $(call -ip-inc,$(word 1,$(subst ., ,$1)),$(word 2,$(subst ., ,$1)),$(word 3,$(subst ., ,$1)),$(word 4,$(subst ., ,$1))))
-ip-inc = $(if $(findstring :$4:,:255:),$(if $(findstring :$3:,:255:),$(if $(findstring :$2:,:255:),$(if $(findstring :$1:,:255:),0.0.0.0,$(call decimal-inc,$1).0.0.1),$1.$(call decimal-inc,$2).0.1),$1.$2.$(call decimal-inc,$3).1),$1.$2.$3.$(call decimal-inc,$4))
until-neq = $(if $(call str-eq,$(word 2,$1),$(call ip-inc,$2)),$(call until-neq,$(wordlist 2,2147483647,$1),$(call ip-inc,$2)),$2$(rparen) $(call gen-ip-range,$(wordlist 2,2147483647,$1)))
gen-ip-range = $(if $1,$(if $(call str-eq,$(call ip-inc,$(firstword $1)),$(word 2,$1)),$(lparen)$(firstword $1)-$(call until-neq,$1,$(firstword $1)),$(firstword $1) $(call gen-ip-range,$(wordlist 2,2147483647,$1))))
IP_LIST = 1.1.1.1 1.1.1.2 1.1.1.3 1.1.1.5 1.1.1.255 1.1.2.1 1.2.3.4 1.255.255.255 100.100.1.2 100.100.1.3
IP_RANGES := $(call gen-ip-range,$(IP_LIST))
$(info $(IP_RANGES))
Фактически это функциональная программа, которая преобразует отсортированный список IP-адресов в формат вашего диапазона. Забавные IP-адреса с начальными 0 или несортированные списки в этом простом примере не обрабатываются (но могут быть с помощью встроенных функций gmtt).