как делают Вас grep, awk, направляются и sed IP-адрес

Я пытаюсь изучить как можно больше о 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

Но я открыт для большего количества путей, если у Вас есть они

2
задан 27 March 2018 в 01:44

3 ответа

Надлежащий путь:

(лучше используйте ip(8) в 2018)

Используя grep-P (regex )

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
1
ответ дан 2 December 2019 в 03:34

Вот образец этого моего ответа:

#!/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
1
ответ дан 2 December 2019 в 03:34

Если вас интересует просто извлечение адреса интерфейса — , что, по-видимому, является основным направлением вашего вопроса — вы всегда можете попробовать команду hostname и очистить ее экран. ', передав его в awk или grep, т.е.:

hostname -I | awk '{print $1}'

Если хост является многосетевым, при использовании awk вы можете переключать вывод адреса путем изменения $1 на $2, $3 и т. д. Обратите внимание, что он также работает с адресами IPv6.

man hostname:

-I, --all-ip-addresses Показать все сетевые адреса хоста. Эта опция перечисляет все настроенные адреса на всех сетевых интерфейсах. То петлевой интерфейс и локальные адреса канала IPv6 опущены. Вопреки к опции -i, эта опция не зависит от разрешения имени. Не делайте никаких предположений о порядке вывода.

В любом случае, еще один (очень простой) способ получить IP-адрес с хоста.

0
ответ дан 18 July 2020 в 12:16

Другие вопросы по тегам:

Похожие вопросы: