Могу ли я получить только список сетевых интерфейсов из ip?

Могу ли я получить только список сетевых интерфейсов из ip?

Я хочу получить список сетевых интерфейсов.

В настоящее время я возвращаю результаты, ip addrа затем выполняю поиск регулярных выражений/строк из вывода следующим образом:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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 
84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link tentative 
       valid_lft forever preferred_lft forever

Меня не особо волнуют все метаданные, я просто ищу имена интерфейсов. Поэтому я хотел бы вместо этого получить:

1: lo
84: eth0@if85

Есть ли способ отфильтровать результаты команды ip addr? Я, конечно, могу использовать какую-то другую магию cli или просто магию regex в своем приложении, но было бы неплохо иметь ipфильтр.

решение1

Да, ты можешь.

Использование grepс PCRE( -P):

ip addr | grep -Po '^\d+:\s+\K[^:]+'
  • ^\d+:\s+совпало с частью перед именем интерфейса в начале, \Kотменяет совпадение

  • [^:]+получает часть до следующей :, т.е. имя интерфейса

Аналогичная логика с использованием sed:

ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'

В моей системе:

% ip addr | grep -Po '^\d+:\s+\K[^:]+'
lo
eth0
wlan0

% ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'
lo
eth0
wlan0

Что вам действительно следует сделать:

Ядро Linux предоставляет интерфейс для доступа к оборудованию, оно sysfsсмонтировано /sys.

/sysВы можете получить имя интерфейса , просто перейдя в соответствующее местоположение /sys/class/net/каталога.

В моей системе:

% ls -1 /sys/class/net/
eth0
lo
wlan0

Каждый из них представляет собой каталог, в подкаталогах которого содержатся файлы, а в каталогах — вся информация об интерфейсе.

Вот список содержимого /sys/class/net/eth0каталога:

% ls -1 /sys/class/net/eth0                                    
addr_assign_type
address
addr_len
broadcast
carrier
carrier_changes
device
dev_id
dev_port
dormant
duplex
flags
gro_flush_timeout
ifalias
ifindex
iflink
link_mode
mtu
name_assign_type
netdev_group
operstate
phys_port_id
phys_port_name
phys_switch_id
power
queues
speed
statistics
subsystem
tx_queue_len
type
uevent

Ответ на отредактированный вопрос:

Чтобы получить имя интерфейса вместе с индексом:

grep:

ip addr | grep -o '^[0-9]\+:[^:]\+'

sed:

ip addr | sed -nE 's/^([[:digit:]]+:[^:]+).*/\1/p'

Для каждого каталога интерфейса в /sys/class/net/, вы можете прочитать файл ifindex. Например, для интерфейса eth0, файл индекса такой:

/sys/class/net/eth0/ifindex

Связанный контент