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 マジックや正規表現マジックを実行することはできますが、それ自体がフィルタリングできれば便利ですip

答え1

はい、できます。

grepPCRE( ) で使用する場合-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

本当にすべきこと:

sysfsLinux カーネルは、 にマウントされているハードウェアを覗くためのインターフェースを提供します/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

関連情報