
네트워크 인터페이스 목록을 검색하려고 합니다.
현재 결과를 반환 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 커널은 하드웨어를 엿볼 수 있는 인터페이스를 제공 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