특정 패턴으로 시작하는 인터페이스만 표시하는 방법

특정 패턴으로 시작하는 인터페이스만 표시하는 방법

Open-Vswitch는 가상 인터페이스를 생성하며 모두 다음 모드를 갖습니다. s[digit]-eth[digit]예:s1-eth1, s1-eth2, s12-eth3, s2-eth3 ...

다음 정보를 표시하고 싶습니다.-예를 들어-s1으로 시작하는 모든 인터페이스(이 예에서는 s1-eth1and 를 제공해야 합니다 s1-eth2).

이 명령을 시도했지만 정보의 첫 번째 줄만 표시됩니다.

여기에 이미지 설명을 입력하세요.

나는 다음과 같은 정보에 더 관심이 있습니다 RX packets, TX packets, erros, HWaddr...

여기에 이미지 설명을 입력하세요.

답변1

ifconfig출력에는 각 인터페이스 사이에 빈 줄이 awk있으므로 perl. "단락"은 하나 이상의 빈 줄로 다른 블록과 구분된 텍스트 블록입니다.

예를 들어:

ifconfig | awk -v RS='' '/^s1-eth[12]:/ {print}'

awk위의 예에서는 레코드 구분 기호( )를 awkRS문자열로 설정하여 개별 줄이 아닌 단락을 처리하도록 합니다. 이 경우 각 단락이 일치하는지 테스트 ^s1-eth[12]:하고 일치하면 인쇄됩니다.

내 시스템의 출력 예:

$ ifconfig | awk -v RS='' '/^(ppp0|lo):/ {print}'
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 64237556  bytes 36962222928 (34.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64237556  bytes 36962222928 (34.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1412
        inet ip.ip.ip.ip  netmask 255.255.255.255  destination ip.ip.ip.ip
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 28220997  bytes 19305565357 (17.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21719890  bytes 3009382446 (2.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

더 이상 단락 단위로 인쇄되지 않습니다. 각 인터페이스 "레코드" 사이에 빈 줄이 없습니다. 출력에 단락을 포함하려면 출력 레코드 구분 기호( ORS)를 두 개의 줄 바꿈( \n\n)으로 설정합니다. 예를 들어

ifconfig | awk -v RS='' -v ORS='\n\n' '/^(ppp0|lo):/ {print}'

ip의 대신 의 출력을 사용하여 유사한 작업을 수행하는 것은 ifconfig약간 더 복잡합니다. ip깔끔한 단락으로 구분된 출력을 생성하지 않습니다. 그러나 각 인터페이스를 블록으로 출력합니다. 여기서 인터페이스 번호 뒤에는 콜론, 줄 시작 부분의 공백, 해당 인터페이스에 대한 나머지 세부 정보가 옵니다.

이 기능을 활용하려면 RS를 정규식( (^|\n)[0-9]+:)으로 설정하세요. 뒤에 콜론과 공백( )이 오는 모든 [0-9]+:숫자 와 일치합니다.누구나파일의 시작 부분( ^첫 번째 레코드와 일치하기 위해, 그렇지 않으면 건너뛰게 됨) 또는 개행 바로 뒤.

예를 들어 내 시스템에서는 다음과 같습니다.

$ ip addr | awk -v RS='(^|\n)[0-9]+: ' '/^(lo|eth0):/ {print}'
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 01:33:ed:b0:13:a9 brd ff:ff:ff:ff:ff:ff

(내 eth0IP 주소는 가상 머신과 도커 컨테이너 사이의 브리지로 설정했기 때문에 IP 주소가 없습니다. IP 주소는 인터페이스에 있습니다 br0.)

답변2

다음을 사용하여 일치하는 줄을 인쇄할 수 있습니다.grep -AnN다음은 행의 수가 다를 수 있으므로 약간 지저분합니다.

더 유용할 수도 있습니다 awk. 그러면 enp1또는 로 시작하는 모든 부분이 인쇄됩니다 enp3. 첫 번째 규칙은 !/^ / {p=0}줄이 공백으로 시작하지 않으면 변수를 지웁니다. 두 번째 규칙은 줄이 우리가 원하는 인터페이스 이름으로 시작하면 변수를 설정한 다음 설정 여부를 인쇄합니다. 공백으로 시작하는 줄은 마지막 규칙과만 일치하므로 이전 값을 기준으로 인쇄됩니다.p/^enp[13]/ {p=1}pp

# /sbin/ifconfig -a  |awk '!/^ / {p=0} /^enp[13]/ {p=1}; p'
enp1s0    Link encap:Ethernet  HWaddr ... 
          inet addr:...
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:135284106 errors:0 dropped:0 overruns:0 frame:0
          TX packets:144695 errors:0 dropped:0 overruns:0 carrier:2
          collisions:0 txqueuelen:1000 
          RX bytes:8292624956 (8.2 GB)  TX bytes:16595674 (16.5 MB)
enp3s0    Link encap:Ethernet  HWaddr ...  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

귀하의 경우에는 물론 비슷한 패턴을 사용하게 됩니다 /^s1-eth/.

답변3

예를 들어 다음으로 시작하는 모든 인터페이스에 대한 정보를 표시하고 싶습니다.s1

사용 net-tools:

ifconfig | grep s1 -A9

사용 iproute2:

ip -s link | grep s1 -A7

답변4

후처리의 경우 최신 버전에서는 iproute2이러한 목적으로 설계된 JSON 출력 형식을 사용할 수 있습니다.

ip -j -s link show |
  jq -r '
    .[]|
    select(.ifname|test("^s\\d+-eth\\d+$"))|
    [.ifname, .stats64.rx.bytes, .stats64.tx.bytes]|
    @csv'

예를 들어 인터페이스 이름, RX 및 TX 바이트가 포함된 CSV 출력을 가져옵니다.

관련 정보