Извлечение IP-адреса и имени интерфейса из ifconfig

У меня есть задача извлечь IP-адреса и список интерфейсов из ifconfig.

ОС FreeBSD

вывод ifconfig:

em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 00:50:56:a5:42:13
        inet 192.168.1.5 netmask 0xfffffff0 broadcast 192.168.1.255
        inet6 fe80::250:56ff:fea1:4213%em0 prefixlen 64 scopeid 0x1
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 00:50:56:a1:62:19
        inet 172.16.16.16 netmask 0xfffffffc broadcast 172.16.16.255
        inet6 fe80::250:56ff:fea1:6229%em1 prefixlen 64 scopeid 0x2
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
br0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 00:50:56:a1:55:27
        inet 10.10.10.11 netmask 0xffffff00 broadcast 10.10.10.255
        inet6 fe80::250:56ff:fea1:5507%em2 prefixlen 64 scopeid 0x3
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active

Я хочу, чтобы вывод был таким:

em0 : 192.168.1.5
em1 : 172.16.16.16
br0: 10.10.10.11

ifconfig | awk '/inet / {split($2,var,"/*"); print $1,":",var[1]}'

ifconfig | grep -o "inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"

ifconfig | sed -En -e 's/.*inet ([0-9.]+).*/\1/p'

В настоящее время я могу извлечь только IP-адреса.

Любая помощь высоко ценится.


person Fuad El Rodriguez    schedule 28.03.2019    source источник
comment
Не могли бы вы подробнее рассказать о проблеме, с которой вы столкнулись?   -  person user803422    schedule 28.03.2019
comment
Что вы уже пробовали и почему не получилось. (Просто перечисление требований и ожидание того, что другие сделают это за вас, не относится к теме переполнения стека)   -  person hardillb    schedule 28.03.2019
comment
у меня нет проблем. Просто хочу извлечь все имена интерфейсов и IP-адреса. вот так: em0: 192.168.1.5 em1: 172.16.16.16 br0: 10.10.10.11   -  person Fuad El Rodriguez    schedule 28.03.2019
comment
Пожалуйста, поместите ответы в блоки ответов. Позже вы можете принять свой ответ. Также см. Как работает принятие ответа?   -  person jww    schedule 28.03.2019


Ответы (4)


Также вы можете извлечь MAC с помощью следующего скрипта:

for ifcfg in $(ifconfig -lu)
do
    mac=$(ifconfig $ifcfg | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}')
    ifconfig $ifcfg | grep -v inet6 | awk -v ifcfg=$ifcfg,$mac '/inet6?/{print ifcfg mac "," $2}' | grep -v lo
done

Вывод:

em0,00:50:56:a5:42:13,192.168.1.5
em1,00:50:56:a1:62:19,172.16.16.16
person Nadir M. Aliyev    schedule 29.03.2019
comment
вам действительно не нужен этот сложный grep для получения MAC-адреса, вы можете упростить его с помощью чего-то вроде ifconfig <interface> ether | awk '/ether /{print $2}' - person nbari; 29.03.2019

Возможно, не самое умное решение, но вы можете попробовать:

while read line
do
  [[ "$line" =~ ^[a-z]+[0-9]: ]] && {
     var=$(echo "$line" | cut -d' ' -f1)
     ip=$(grep -A3 "$var" <(ifconfig)  | grep -oP 'inet.{0,15}' | cut -d' ' -f2)
     echo "$var" "$ip"
  }
done < <(ifconfig)
person nullPointer    schedule 28.03.2019
comment
grep: опция -P не поддерживается - person Fuad El Rodriguez; 28.03.2019
comment
Немного поправлено, но все равно результат не исключен: while read line do [[ "$line" =~ ^[a-z]+[0-9]: ]] && { var=$(echo "$line" | cut -d' ' -f1) ip=$(grep -A3 "$var" <(ifconfig) | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" ) echo "$var" "$ip" } done < <(ifconfig) - person Fuad El Rodriguez; 28.03.2019
comment
@Fuad, попробуй с egrep -o 'inet.{0,15}' - person nullPointer; 28.03.2019
comment
grep -o [0-9]*\.[0-9]*\.[0-9]*\.[0-9]* - person Fuad El Rodriguez; 28.03.2019
comment
@Fuad Если вы не сопоставляете строгие IP-адреса, потому что ожидаете только IP-адреса и не хотите использовать egrep, как предлагает funkyjelly, вы можете просто использовать grep -o inet [0-9 \ .]* - person Gavin Jackson; 28.03.2019


Пытаться

for ifcfg in $(ifconfig -lu)
do
   ifconfig $ifcfg | grep -v inet6 | awk -v ifcfg=$ifcfg '/inet6?/{print ifcfg " : " $2}'
done

Надеюсь, поможет.

person Nadir M. Aliyev    schedule 29.03.2019