Как напечатать диапазон IP-адресов с помощью команды Linux seq

8

Как я могу напечатать диапазон IP-адресов в командной строке Linux, используя команду "seq"? Например: мне нужен seq для печати диапазона ip от 10.0.0.1 до 10.0.0.23. Похоже, что период между октетами приводит к тому, что число ведет себя как число с плавающей запятой. Я получаю "неверную ошибку аргумента с плавающей точкой". Я пытался использовать опцию -f. Может быть, я не правильно его использую. Но это все равно дало мне ошибку. Я пытаюсь что-то похожее на

seq 10.0.0.2 10.0.0.23

Есть ли другой способ печатать IP-адреса в диапазоне, отличном от Linux, кроме переключения на Excel?

user2476714
источник
5
С bashэтим диапазоном адресов можно распечатать echo 10.0.0.{2..23}. {..}Конструкция называется подстановка скобок.
John1024

Ответы:

22

Используйте формат:

$ seq -f "10.20.30.%g" 40 50
10.20.30.40
10.20.30.41
10.20.30.42
10.20.30.43
10.20.30.44
10.20.30.45
10.20.30.46
10.20.30.47
10.20.30.48
10.20.30.49
10.20.30.50

К сожалению, это неочевидно, поскольку GNU не любит писать man-страницы.

Майкл Хэмптон
источник
2
Я думаю, что было бы лучше сослаться на руководство, которое они предоставляют, чем только отметить, что страница справочника слишком краткая. См info coreutils 'seq invocation'.
Хокан Линдквист
1
@ HåkanLindqvist Я ненавижу, абсолютно ненавижу, информация GNU. И не говоря уже о том, что там %gне задокументировано; Вы должны выследить правильную printfинформационную страницу.
Майкл Хэмптон
2
Безусловно, ссылки man 3 printfтакже являются хорошей идеей, если читатель не знаком со строками формата printf. Тем не менее, я не большой поклонник их использования texinfo, но это было только мое предложение для улучшения вашего ответа, используя существующую документацию, просто указывая на отсутствие документации в определенном формате.
Хокан Линдквист
11

Существует pripsутилита, которая генерирует список IP-адресов из диапазона или CIDR. Полезно для работы с большими диапазонами:

$ prips 10.0.0.20 10.0.0.23
10.0.0.20
10.0.0.21
10.0.0.22
10.0.0.23

$ prips 10.0.0.0/23
10.0.0.0
10.0.0.1
10.0.0.2
<...>
10.0.1.254
10.0.1.255
user4151603
источник
8

Вы можете использовать команду sed с seq для вывода диапазона IP-адресов.

seq 2 23 | sed 's/^/10.0.0./'

ИЛИ используя echo и tr

echo 10.0.0.{2..23} | tr ' ' '\n'
Вайбхав Панманд
источник
3

Команда printfвыполняет неявную итерацию, если ей дано больше аргументов, чем спецификаторов преобразования. Например:

$ printf "%s-%s\n" 1 2 3 4 5 6
1-2
3-4
5-6

Есть два преобразования, но шесть аргументов. Таким образом, происходит три повторения логики форматирования, проходя через аргументы попарно.

С этим мы можем сделать:

printf "10.0.0.%s\n" $(seq 1 23)

Команда printfи ее повторяющееся поведение соответствуют стандарту POSIX : «Операнд формата должен использоваться повторно так часто, как это необходимо для удовлетворения операндов аргумента». С другой стороны, seqкоманда не.

Kaz
источник
3
for i in $(seq 2 23); do echo "10.0.0.$i"; done
user163009
источник
@don_crissti, почему?
user163009
"Почему" что?
don_crissti
редактировать и понижать?
user163009
Я не отрицатель - скорее всего, система автоматически понизит ваш ответ. Я только рассмотрел это (отредактировал это). Как и зачем редактировать? Ну, потому что это код и должен быть правильно отформатирован.
don_crissti
2

Если мы удалим требование использовать seqкоманду и предположим, что ipcalcкоманда доступна, а команда Ubuntu prips- нет, то она pripsможет быть реализована как функция оболочки Bash:

prips() {
  cidr=$1

  # range is bounded by network (-n) & broadcast (-b) addresses.
  lo=$(ipcalc -n $cidr |cut -f2 -d=)
  hi=$(ipcalc -b $cidr |cut -f2 -d=)

  read a b c d <<< $(echo $lo |tr . ' ')
  read e f g h <<< $(echo $hi |tr . ' ')

  eval "echo {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}"
}

Обратите внимание, что это будет включать сетевой адрес и широковещательный адрес в диапазоне; если это проблема, удалите первый и последний адрес из результата.

Алекс Харви
источник