Как получить первый IP-адрес из команды ifconfig?

9

Как захватить первый IP-адрес, который приходит из ifconfigкоманды?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ожидаемый результат:

IP=100.14.22.12
Яэль
источник
3
На вопрос был получен ответ, используя awk или grep / cut и т. Д. Но в целом все еще плохая идея использовать grep из ifconfig. ip лучше подходит и лучше поддерживается в современных сборках Linux.
Педро
1
Это звучит как проблема XY. Какую информацию вы действительно хотите? Основной сетевой IP-адрес машины? Любой сетевой IP-адрес машины? IP-адрес первого сетевого адаптера? Любой IP-адрес, не имеет значения, что это? Вероятно, есть более прямой, точный и портативный способ получения необходимой информации.
alex.forencich

Ответы:

20

Лучше избегать использования ifconfigдля получения IP-адреса в скрипте, поскольку он не рекомендуется в некоторых дистрибутивах (например, CentOS и других, больше не устанавливайте его по умолчанию).

В других системах вывод ifconfig варьируется в зависимости от выпуска дистрибутива (например, output / spacing / fields ifconfigотличается от Debian 8 до Debian 9, например).

Для получения IP-адреса ipаналогичным образом вы спрашиваете:

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

Или еще лучше:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

Или, как вы спросите "IP ="

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

Бесстыдно адаптирует идею от @Roman

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

Нормальный выход:

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

От man ip:

-o, -oneline
выводит каждую запись в одну строку, заменяя перевод строки символом «\». Это удобно, когда вы хотите считать записи с помощью wc (1) или grep (1) вывода.

Посмотрите один пример того, почему ifconfigэто не рекомендуется: BBB: `bbb-conf --check`, показывающий IP-адреса как` inet` - горе ifconfig

Чтобы понять причину ifconfigвыхода, смотрите раздел Разница между командами 'ifconfig' и 'ip'

ifconfigиз net-tools, которые долгое время не могли полностью поддерживать сетевой стек Linux. Он также по-прежнему использует ioctl для настройки сети, что является уродливым и менее мощным способом взаимодействия с ядром.

Примерно в 2005 году был введен новый механизм управления сетевым стеком - сокеты netlink.

Для настройки сетевого интерфейса iproute2используется механизм полнодуплексного сокета netlink, в то время как для него ifconfigиспользуется системный вызов ioctl.

Руи Ф Рибейро
источник
Я предпочитаю не устанавливать eth0 по умолчанию, потому что это имя меняется на компьютерах, можем ли мы предоставить гибкий синтаксис
yael
@yael изменился, достал eth0. Однако Роман сделал лучше, чем я, напечатав «IP =» внутри awk. Слишком много умственных способностей для меня, все еще просыпается. Избегайте ifconfig, у него нет будущего, и позиция IP-адреса меняется, есть как минимум две разные версии / реализации (?) Для Linux, которые я знаю.
Руи Ф. Рибейро
Просто для информации, в более новых версиях iproute2 (например, не в CentOS7 и не в Debian8) ip может принимать -briefпараметр, и его вывод становится легче анализировать (2015-08-31: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB
@AB также -o, поскольку я использую подсказки, спасибо, проверим это
Rui F Ribeiro
1
Ах, я не знал о том, -oчто действительно кажется полезным для сценариев
AB
6

Awk решение:

ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'

Пример вывода:

IP=10.0.2.15
RomanPerekhrest
источник
-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}
Брайан Олсон
источник
1
увидеть это:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Рибейро
1
Почему вы ищете локальный IP-адрес 127.0.0.1?
Джефф Шаллер