단일 명령(파이프라인)을 통해 인터페이스 IP 주소 인쇄

단일 명령(파이프라인)을 통해 인터페이스 IP 주소 인쇄

구성된 경우다음과 같은 출력을 제공합니다.

   eth0      Link encap:Ethernet  HWaddr 4c:87:0e:z3:e7:11  
              UP 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)

    lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:35767 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35767 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:5053027 (5.0 MB)  TX bytes:5053027 (5.0 MB)

vmnet1    Link encap:Ethernet  HWaddr 60:80:66:m0:00:01  
          inet addr:192.168.139.1  Bcast:192.168.139.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fec0:1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:70 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

현재 이와 같은 출력이 필요합니다.

eth0   
wlan0   127.0.0.1
vmnet1  192.168.139.1

그래서 명령을 실행합니다.

ifconfig | awk '/encap|inet addr/{  print }'

하지만 날씨에 따라 2개의 행을 병합해야 하고 다음 행에 ipaddress 패턴이 포함되어 있기 때문에 지금은 막혔습니다. 쉘 스크립트를 사용하면 문제가 해결될 수 있지만 간단한 단일 명령 솔루션이 필요합니다. awk에 for 루프가 있지만 다음 줄을 기대하고 일치시킨 다음 콘솔에 인쇄하는 것은 나에게 어려운 일입니다.

아니면 이와 같은 것을 달성하기 위한 간단한 명령/플래그가 있습니까?

Route 명령은 트릭(awk 필드 추출!!)을 수행하는 것처럼 보이지만 비활성 인터페이스를 나열하지 않습니다.

답변1

GNU/Linux를 실행하는 경우:

for DEV in /sys/class/net/*; do
    printf "%-10s %s\n" ${DEV##*/} $(ip addr show ${DEV##*/} | \
      sed -rne '/inet/s:\s+inet\s+([0-9.]+).*:\1:gp');
done

또는 ifconfig요구사항인 경우:

for DEV in /sys/class/net/*; do
    printf "%-10s %s\n" ${DEV##*/} $(ifconfig ${DEV##*/} | \
      sed -rne '/inet adr/s/\s+inet adr:([0-9.]+).*/\1/gp');
done

그것은 생산한다

eth0       192.168.10.34
eth1       
lo         127.0.0.1
...

필요하지만 iproute2.

답변2

마침내 ifconfig 기반 솔루션을 찾았습니다!

String s="ifconfig | awk -F '[ :]' '/encap|inet addr/{ if($1 != \"\" ){ print $1 \":\" $13 } else print $13 }'| awk -F \":\" '{print $1}'| awk '{  curr=$1 ; if(!system(\"echo \"$1\"|grep ^[0-9]>/dev/null\")) {print prev \"\\t : \" curr;prev=\"\"} else { if(prev!=\"\") {print prev \"\\t : not assigned\" }; prev=$1 }   }'"

설명하다:

root$ ifconfig | awk -F '[ :]' '/encap|inet addr/{ if($1 != "" ){ print $1 ":" $13 } else print $13 }'| awk -F ":" '{print $1}'
eth0
lo
127.0.0.1
vmnet1
192.168.139.1
vmnet8
192.168.152.1
wlan0
10.208.7.86

그래서 위의 출력을 다른 awk 명령으로 파이프했습니다.

| awk '{  curr=$1 ; if(!system("echo "$1"|grep ^[0-9]>/dev/null")) {print prev "\t : " curr;prev=""} else { if(prev!="") {print prev "\t : not assigned" }; prev=$1 }   }'

여기서 두 개의 연속된 인터페이스 이름을 찾으면 이름을 인쇄합니다.이전 페이지사용자 정의 메시지가 포함된 다양한 인터페이스"할당되지 않음".문자열에서 숫자 패턴을 얻으면 현재 문자열(IP 주소)과이전 페이지io 인터페이스 이름이 인쇄됩니다!

답변3

ifconfig-a| awk '/Link/ {n=$1} /addr/ {print n, substr($2,index($2,":")+1))}'

간단하게 이름을 알아낸 다음 주소가 나타나면 콜론 뒤에 이름과 주소를 인쇄하세요.

답변4

또 다른 가능성은 ifconfig및 입니다 awk. 별칭 인터페이스(eth0:1) 및 VLAN 인터페이스(eth0.1)에서도 작동해야 합니다.

ifconfig | awk 'BEGIN {RS="\n\n"; } { if ($7 != "addr:") {print $1,$7} }'

RSawk의 매개변수는 레코드 구분 기호이며, 이를 2개의 줄 바꿈으로 설정했습니다. 이로 인해 awk는 각 인터페이스에 대한 모든 정보를 한 줄로 결합합니다. 또한 IPv4 주소가 구성되지 않은 인쇄 인터페이스도 비활성화합니다.

이 명령을 사용하여 각 인터페이스의 IP와 확인된 호스트 이름을 표시합니다.

ifconfig | awk 'BEGIN {RS="\n\n"; } { if ($7 != "addr:") {print $1,$7} }' | sed 's/addr://g' | while read iface ip; do
  echo $iface $ip $(getent hosts | awk '/^'$ip'/ {print $2}');
done

출력은 다음과 같습니다.

bond0 10.126.226.102 deh137.abc.biz.
bond0:1 10.126.227.10 aeudi64.abc.biz.
bond0:7 10.126.226.141 rtlci22.abc.biz.
bond1.625 10.126.216.142
bond1.654 10.126.228.102 deh137s.abc.biz.

편집하다:DNS 및 /etc/hosts 기반 확인과 함께 작동하도록 마지막 명령을 업데이트했습니다.

관련 정보