#shell #freebsd #ifconfig
#оболочка #freebsd #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-адреса.
Любая помощь высоко ценится.
Комментарии:
1. Не могли бы вы, пожалуйста, подробнее рассказать о проблеме, с которой вы столкнулись?
2. Что вы уже пробовали и почему это не сработало. (Просто перечислять требования и ожидать, что другие сделают это за вас, не по теме для Stack Overflow)
3. У меня нет проблем. Просто хочу извлечь все имена интерфейсов и IP-адреса. вот так: em0: 192.168.1.5 em1: 172.16.16.16 br0: 10.10.10.11
4. Пожалуйста, размещайте ответы в блоках ответов. Позже вы можете принять свой собственный ответ. Также смотрите, как работает принятие ответа?
Ответ №1:
Возможно, это не самое разумное решение, но вы можете попробовать его :
while read line
do
[[ "$line" =~ ^[a-z] [0-9]: ]] amp;amp; {
var=$(echo "$line" | cut -d' ' -f1)
ip=$(grep -A3 "$var" <(ifconfig) | grep -oP 'inet.{0,15}' | cut -d' ' -f2)
echo "$var" "$ip"
}
done < <(ifconfig)
Комментарии:
1. grep: опция -P не поддерживается
2. Немного исправлено, но все равно результат не исключен:
while read line do [[ "$line" =~ ^[a-z] [0-9]: ]] amp;amp; { 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)
3. @Fuad попробуй с
egrep -o 'inet.{0,15}'
4. grep -o «[0-9]*.[0-9]*.[0-9]*.[0-9]*»
5. @Fuad Если вы не сопоставляете строгие IP-адреса, потому что вы ожидаете только IP-адреса, и вы не хотите использовать egrep, как предлагает funkyjelly, тогда вы можете просто использовать grep -o «inet [0-9 .] *»
Ответ №2:
В случае, если у вас есть только csh
(по умолчанию оболочка FreeBSD) и вам нужно получить IP-адреса -l
запущенных -u
интерфейсов, вы можете попробовать это:
$ foreach i (`ifconfig -lu`)
ifconfig $i | awk -v i=$i '/inet6?/{print i ": " $2}'
end
Это вернет адреса IPv4 и IPv6 в формате:
<interface>: IP
-l
Флаг может использоваться для перечисления всех доступных интерфейсов в системе,Опция
-u
ограничивает это для интерфейсов, которые запущены.
Если вам просто нужен IPv4 ( inet
), вы могли бы использовать что-то вроде:
$ foreach i (`ifconfig -lu`)
ifconfig $i inet | awk -v i=$i '/inet6?/{print i ": " $2}'
end
Комментарии:
1. Обратите внимание, что это
up
не означаетstatus: active
: интерфейс может бытьup
без наличия соединенияactive
.
Ответ №3:
Попробуйте
for ifcfg in $(ifconfig -lu)
do
ifconfig $ifcfg | grep -v inet6 | awk -v ifcfg=$ifcfg '/inet6?/{print ifcfg " : " $2}'
done
Надеюсь, это поможет.
Ответ №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
Комментарии:
1. на самом деле вам не нужно ничего сложного
grep
для получения MAC-адреса, вы могли бы упростить это чем-то вродеifconfig <interface> ether | awk '/ether /{print $2}'