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

실제로 해야 할 일:

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

관련 정보