Оболочка Bash для создания диапазона из списка IP-адресов

#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).