используя Bash, как я могу получить имя сетевого устройства и IP-адрес в одной строке? - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу получить имя устройства сетевого интерфейса (ens ###) вместе с соответствующим IP-адресом (###. ###. ###. ###).У меня есть решения, чтобы получить один или другой, но я не смог найти что-то, что может выводить каждую пару (имя + IP) в строку.

Вот команда для получения IP

ip address | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'

И здесь я могу получить имя устройства

ip address | grep -v lo | cut -d ' ' -f2 | tr ':' '\n' | awk NF

Однако я хотел бы получить способ, который бы выводил каждый набор на свою собственную строку, что-то вроде

ens32 10.0.0.100
ens33 10.1.0.100

РЕДАКТИРОВАТЬ:

Вот пример вывода IP-адреса

[root@centos ~]# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.100/23 brd 10.0.1.255 scope global dynamic ens32
       valid_lft 83040sec preferred_lft 83040sec
    inet6 0000::000:0000:0000:0000/64 scope link
       valid_lft forever preferred_lft forever
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.100/24 brd 10.0.2.255 scope global dynamic ens33
       valid_lft 1277sec preferred_lft 1277sec
    inet6 0000::000:0000:0000:0000/64 scope link
       valid_lft forever preferred_lft forever

РЕШЕНИЯ:

Оба из них даст мне тот же желаемый выход.Спасибо за помощь!

ip -o addr show scope global | awk '/^[0-9]:/{print $2, $4}' | cut -f1 -d '/'
ip -o addr show scope global | tr -s ' ' | tr '/' ' ' | cut -f 2,4 -d ' '

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Если вам нужен однострочный, попробуйте это (спасибо Дуги за более точную команду ip):

ip -oneline -4 addr show scope global | tr -s ' ' | tr '/' ' ' | cut -f 2,4 -d ' '

-oneline принудительно выводит вывод для каждого интерфейса в одну строку.

Затем мы cut извлекаем только имя интерфейса и IP из вывода, tr немного аннулируя его по пути (для вырезания, чтобы избавиться от лишних вещей).

0 голосов
/ 13 декабря 2018

Ну, awk, как всегда, работает как брелок.

ip address | 
awk '
    /^[0-9]:/{
        name=substr($2, 1, length($2) - 1)
    }
    /^[ ]*inet /{
        split($2, a, "/")
        if (name != "lo")
            print name,a[1]
    }
'

произойдет:

ens32 10.0.0.100
ens33 10.1.0.100
  1. Если строка начинается с цифры и двойного знака, затем получите имя из второго поля, за исключением удаления : с подстрокой.
  2. Если строка начинается с inet и пробелов, это означает, что второй аргумент имеет IP-адрес.Я также удаляю суффикс маски сети простым разбиением.
  3. Если имя интерфейса lo, мы не печатаем вывод, тем самым фильтруя интерфейс обратной связи.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...