네트워크 인터페이스 목록을 검색하려고 합니다.
현재 결과를 반환 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
그래 넌 할수있어.
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 커널은 .dll 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