¿Puedo obtener solo la lista de interfaces de red de ip?

¿Puedo obtener solo la lista de interfaces de red de ip?

Estoy buscando recuperar una lista de interfaces de red.

Actualmente estoy devolviendo los resultados ip addry luego haciendo algunas búsquedas de expresiones regulares/cadenas a partir de resultados como este:

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

Realmente no me importan todos los metadatos, solo busco los nombres de las interfaces. Entonces me gustaría obtener:

1: lo
84: eth0@if85

¿Hay alguna forma de filtrar los resultados del ip addrcomando? Definitivamente puedo hacer alguna otra magia cli o simplemente magia de expresiones regulares en mi aplicación, pero sería bueno tener ipun filtro.

Respuesta1

Sí tu puedes.

Usando grepcon PCRE( -P):

ip addr | grep -Po '^\d+:\s+\K[^:]+'
  • ^\d+:\s+coincide con la parte antes del nombre de la interfaz al inicio, \Kdescarta la coincidencia

  • [^:]+obtiene la porción hasta la siguiente :, es decir, el nombre de la interfaz

Lógica similar usando sed:

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

En mi sistema:

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

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

Lo que realmente deberías hacer:

El kernel de Linux proporciona una interfaz para echar un vistazo al hardware, que está sysfsmontado en /sys.

Puede obtener el nombre de la interfaz simplemente accediendo a la ubicación adecuada del /sysdirectorio /sys/class/net/con precisión.

En mi sistema:

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

Cada uno de estos son directorios, los subdirectorios contienen archivos y los directorios tienen toda la información sobre la interfaz.

Aquí está la lista del contenido del /sys/class/net/eth0directorio:

% 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

Respuesta a la pregunta editada:

Para obtener el nombre de la interfaz junto con el índice:

grep:

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

sed:

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

Para cada directorio de interfaz en /sys/class/net/, puede leer el archivo ifindex. Por ejemplo, para la interfaz eth0, el archivo de índice es:

/sys/class/net/eth0/ifindex

información relacionada