Я пытаюсь изучить как можно больше о Linux, я в настоящее время застреваю при попытке захватить определенные части моего ifconfig текстового дисплея, таким образом, это точно походит на это:
eth0:
inet 192.168.1.000 netmask 255.255.255.0 broadcast 192.168.1.255
wlan0:
inet 192.168.1.xxx netmask 255.255.255.0 broadcast 192.168.1.255
Я так приблизился, до сих пор я попробовал приблизительно миллион возможных комбинаций, но я близко к исчерпанному, это - часть из того, что я попробовал.
ifconfig | head -19 | sed 'wlan0|\eth0' | awk '{print $2}'
ifconfig | head -19 | egrep 'wlan0|\eth0' | awk '{print $1}' | sed '/^net/p'
ifconfig | head -19 | egrep 'wlan0|\eth0|' | awk '{print $1}'
ifconfig | cut -d: -f1 | awk '{print $2}' | cut -d: -f1
Это настолько же близко, как я приехал
ifconfig | head -n 2 | cut -d: -f1; ifconfig | tail -8 | head -1
eth0
inet 192.168.1.000 netmask 255.255.255.0 broadcast 192.168.1.255
inet 192.168.1.xxx netmask 255.255.255.0 broadcast 192.168.1.255
Я пропускаю wlan0 промежуточные 000 и xxx, Спасибо за Ваше время и усилие.
Мой дисплей
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.000 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 xxxxxxxxxxxxxxxxxxxxxxx prefixlen 64 scopeid 0x20<link>
ether xxxxxxxxxxx txqueuelen 1000 (Ethernet)
RX packets 711634 bytes 635444016 (606.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 523020 bytes 98052518 (93.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 4266 bytes 735580 (718.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4266 bytes 735580 (718.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.xxx netmask 255.255.255.0 broadcast 192.168.1.255
inet6 xxxxxxxxxxxxxxxx prefixlen 64 scopeid 0x20<link>
ether xxxxxxxxxxx txqueuelen 1000 (Ethernet)
RX packets 2429 bytes 371836 (363.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 227 bytes 79847 (77.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Я просто нашел путь с
ifconfig | head -n 2 | cut -d: -f1; ifconfig | tail -9 | cut -d: -f1 | head -2
Но я открыт для большего количества путей, если у Вас есть они
Надлежащий путь:
(лучше используйте ip(8)
в 2018)
for dev in wlan0 eth0; do
ip address show dev $dev |
grep -oP 'inet\s+\K\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
done
for dev in wlan0 eth0; do
ip address show dev $dev |
awk -F'[ /]' '/inet /{print $6}'
done
for dev in wlan0 eth0; do
ifconfig $dev | awk '/inet /{print $2}'
done
for dev in wlan0 eth0; do
ifconfig $dev | awk -vdev=$dev '/inet /{print dev, $2}'
done
Вот образец этого моего ответа:
#!/bin/bash
# NAME: getIP
# Set the names of the target interfaces as array or assign the user's input
[[ -z ${@} ]] && IFACES=$(/sbin/ifconfig | sed -r '/^ .*/d; s/ .*//' | tr '\r\n' ' ') || IFACES=($@)
# Set IPv4 address match pattern
IPv4='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
# Get the IP address
for IFACE in ${IFACES[@]}; do
/sbin/ifconfig "$IFACE" 2>/dev/null | grep -Po "${IPv4}" | tr '\r\n' ' ' | \
awk -v iface="${IFACE}:" 'BEGIN{ print iface } { printf "\tinet %-16s netmask %-16s broadcast %s\n",$1, $3, $2}'
done
Примечание: Сценарий основан на выводе ifconfig
в Ubuntu 16.04. Использование:
$ ./getIP # Automatic mode
enp2s0:
inet 192.168.100.110 netmask 255.255.255.0 broadcast 192.168.100.255
lo:
inet 127.0.0.1 netmask broadcast 255.0.0.0
vmnet1:
inet 192.168.201.1 netmask 255.255.255.0 broadcast 192.168.201.255
vmnet8:
inet 192.168.15.1 netmask 255.255.255.0 broadcast 192.168.15.255
$ ./getIP enp2s0 # User's input mode
enp2s0:
inet 192.168.100.110 netmask 255.255.255.0 broadcast 192.168.100.255
Если вас интересует просто извлечение адреса интерфейса — , что, по-видимому, является основным направлением вашего вопроса — вы всегда можете попробовать команду hostname
и очистить ее экран. ', передав его в awk
или grep
, т.е.:
hostname -I | awk '{print $1}'
Если хост является многосетевым, при использовании awk
вы можете переключать вывод адреса путем изменения $1
на $2
, $3
и т. д. Обратите внимание, что он также работает с адресами IPv6.
man hostname
:
-I, --all-ip-addresses Показать все сетевые адреса хоста. Эта опция перечисляет все настроенные адреса на всех сетевых интерфейсах. То петлевой интерфейс и локальные адреса канала IPv6 опущены. Вопреки к опции -i, эта опция не зависит от разрешения имени. Не делайте никаких предположений о порядке вывода.
В любом случае, еще один (очень простой) способ получить IP-адрес с хоста.