Как использовать ifconfig для отображения только активного интерфейса

По умолчанию ifconfig покажет мне все доступные интерфейсы, но что если я хочу отобразить только активные? Например, только en0, как показано ниже.

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

Заметьте, ifconfig en0 не удовлетворит, en0 не всегда активен ;)

Я использую Mac OS X.

Если вы хотите выводить "запись" только в том случае, если она содержит status: active, то вы можете использовать что-то вроде этой программы awk в качестве фильтра для вывода ifconfig:

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

Когда начинается каждая "запись" (строка пуста или не начинается с Tab), начните сохранять запись в буфер. Добавьте в этот буфер все последующие строки, начинающиеся с Tab. Следите за магической строкой status: active; если такая строка была замечена, выведите буфер (предыдущую "запись"), когда начнется новая "запись" (или закончится ввод).

Сохраните приведенный выше текст программы в файл и используйте его следующим образом:

ifconfig -a | awk -f /path/to/file

Или, если вы chmod +x файл, то вы можете немного упростить его:

ifconfig -a | /path/to/file
Комментарии (0)

Читая ваши комментарии и вопрос, кажется, что вы хотите получить только те интерфейсы, которым назначен IP-адрес.

Это можно быстро сделать с помощью ifconfig и grep.

Выполняем команду:

ifconfig | grep 'Link\|inet'

Должно получиться что-то похожее:

eth0 Link encap:Ethernet HWaddr 00:11:22:33:44:55
eth1 Link encap:Ethernet HWaddr 00:11:22:33:44:66
          inet addr:192.168.0.8 Bcast:192.168.0.255 Mask:255.255.255.0
lo Link encap:Local Loopback
          inet addr:127.0.0.1 Mask:255.0.0.0

Это покажет каждую строку с именем интерфейса и IP, если он есть.

Некоторые более специфические REGEX могут дать вам именно то, что вам нужно.

Комментарии (2)
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Как это работает:

  • ifconfig
  • Найдите строки, содержащие "inet addr"
    • Эти строки содержат IP-адреса.
  • Найдите строки, не содержащие "127.0.0.1"
    • Мы обычно не заботимся о localhost.
    • -v - это инвертированный grep
  • Из оставшихся строк удалите "Bcast";
  • Вырежьте поле 2, используя ":" в качестве разделителя
    • Выводит ответ.
Комментарии (0)