구성된 경우다음과 같은 출력을 제공합니다.
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} }'
RS
awk의 매개변수는 레코드 구분 기호이며, 이를 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 기반 확인과 함께 작동하도록 마지막 명령을 업데이트했습니다.