При добавлении IP-адресов с помощью ifconfig eth:xx, как мне в одной строке найти наивысший eth:xx?

При добавлении IP-адресов с помощью ifconfig eth:xx, как мне в одной строке найти наивысший eth:xx?

Это будет в скрипте Perl, мне нужно взять это число и увеличить его на единицу для новых IP. У кого-нибудь есть однострочник для меня? Можно Bash/Perl.

редактировать

Учитывая следующие данные.

inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4

Он должен выдать 4. Учитывая то, что вы мне дали ниже

$ ip addr | grep -e 'eth[0-9]:[0-9]' | cut -d: -f2

Если вы измените свой ответ на этот, я приму его, поскольку он помог мне понять это.

решение1

ifconfig

Если я правильно понял, вам нужна однострочная команда, которая будет брать выходные данные ifconfigи возвращать следующее устройство eth:xx для использования.

Итак, если у нас используются eth0:0, eth0:1 и eth0:2, команда должна вернуть 3?

Пример

Такая команда должна делать то, что вам нужно.

$ if (ifconfig | grep -q "^eth"); then \
      echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

Итак, если у нас есть одно устройство Ethernet:

$ ifconfig | grep eth
eth0:0      Link encap:Ethernet  HWaddr F0:DE:F1:2F:7D:4E  

Наша команда вернет 1:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
1

Если у нас нет устройств Ethernet, то мы вернем 0:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
0

Подробности

Хорошо, может показаться, что здесь много всего происходит, но на самом деле все довольно просто.

  1. оператор if - изначально нам нужно знать, есть лилюбойУстройства Ethernet, поэтому мы запускаем ifconfigи grep вывода в поисках одного. Если мы находим одно, то мы продолжаем запуск ifconfigи анализируем его.
  2. 2nd ifconfig - Здесь мы фактически анализируем вывод. Мы используем grepPCRE-средство ( -P) для поиска строк, начинающихся с ethXX:. Коммутатор -oвернет цифру, которая стоит после ethXX:.
  3. сортировка - Затем мы сортируем sortрезультаты в числовом виде, если у нас несколько устройств ethXX:YY.
  4. tail — возвращает последнее, это будет устройство ethXX:YY с наибольшим значением.
  5. Затем мы увеличиваем это число с помощью $(( $(ifconfig ...) + 1 )). Так что если ethXX:YY равен 0, мы получим 0 + 1в результате 1.
  6. эхо - затем echoрезультаты шага 5.
  7. Если в выводе нет устройства eth ifconfig, то вернуть 0, так как это будет первое устройство.

IP-адрес

Если вы хотите использовать ip addrвместо этого, вы можете воспользоваться этой формой решения, представленной выше.

$ if (ip addr | grep -q "eth"); then \
      echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

Пример

Используя ваш образец данных:

inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4

Эта команда вернет 5:

$ if (ip addr | grep -q "eth"); then echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
5

решение2

Это не прямой ответ на ваш вопрос, а скорее альтернативное решение.

Альтернативным решением является использованиеiproute2утилиты. ifconfigустарели и постепенно устаревают. Они неадекватны и не способны полностью управлять сетевым стеком Linux.

Например, как вы знаете, с помощью ifconfig, вам нужно создать интерфейс псевдонима ( eth0:0, eth0:1, и т. д.) для каждого IP, который вы хотите назначить этой машине. Это проблема, так как у вас может быть только 255 псевдонимов интерфейса. С помощью команды ipиз iproute2 вы можете назначить столько IP, сколько захотите, одному интерфейсу.

Пример использования:

# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link 
       valid_lft forever preferred_lft forever

# ip addr add 10.0.0.1/24 dev enp5s0

# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet 10.0.0.1/24 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link 
       valid_lft forever preferred_lft forever

Вам не нужно знать ничего о текущей конфигурации интерфейса, кроме его имени. Не нужно вычислять следующий неиспользуемый номер псевдонима интерфейса.

Связанный контент