
Ich möchte eine Liste der Netzwerkschnittstellen abrufen.
Derzeit gebe ich die Ergebnisse zurück ip addr
und führe dann in der Ausgabe eine Regex-/String-Suche wie folgt durch:
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
Die ganzen Metadaten interessieren mich nicht wirklich, ich suche nur nach den Schnittstellennamen. Stattdessen hätte ich gerne:
1: lo
84: eth0@if85
Gibt es eine Möglichkeit, die Ergebnisse des ip addr
Befehls zu filtern? Ich kann in meiner App definitiv andere CLI-Magie oder einfach Regex-Magie anwenden, aber es wäre schön, wenn es ip
einen eigenen Filter gäbe.
Antwort1
Ja, du kannst.
Verwendung grep
mit PCRE( -P
):
ip addr | grep -Po '^\d+:\s+\K[^:]+'
^\d+:\s+
stimmte mit dem Teil vor dem Schnittstellennamen am Anfang überein,\K
verwirft die Übereinstimmung[^:]+
erhält den Teil bis zum nächsten,:
also den Schnittstellennamen
Ähnliche Logik mit sed
:
ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'
Auf meinem System:
% ip addr | grep -Po '^\d+:\s+\K[^:]+'
lo
eth0
wlan0
% ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'
lo
eth0
wlan0
Was Sie wirklich tun sollten:
Der Linux-Kernel bietet eine Schnittstelle für den Einblick in die Hardware, sysfs
auf der er gemountet ist /sys
.
Sie können den Schnittstellennamen erhalten, indem Sie einfach zum entsprechenden Speicherort des /sys
Verzeichnisses gehen /sys/class/net/
.
Auf meinem System:
% ls -1 /sys/class/net/
eth0
lo
wlan0
Dabei handelt es sich jeweils um Verzeichnisse mit Unterverzeichnissen, die Dateien und Verzeichnisse mit allen Informationen zur Schnittstelle enthalten.
Hier ist die Auflistung des /sys/class/net/eth0
Verzeichnisinhalts:
% 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
Antwort auf die bearbeitete Frage:
So erhalten Sie den Schnittstellennamen zusammen mit dem Index:
grep
:
ip addr | grep -o '^[0-9]\+:[^:]\+'
sed
:
ip addr | sed -nE 's/^([[:digit:]]+:[^:]+).*/\1/p'
Für jedes Schnittstellenverzeichnis in /sys/class/net/
können Sie die Datei lesen ifindex
. Für die Schnittstelle eth0
lautet die Indexdatei beispielsweise:
/sys/class/net/eth0/ifindex