Ifconfig

通過單個命令(管道)列印 interface-ipaddress

  • November 20, 2018

ifconfig給出以下輸出:

  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 模式。雖然 shell 腳本可以解決問題,但我需要一個簡單的單命令解決方案。雖然 awk 中有 for 循環,但向前看下一行,匹配然後在控制台上列印對我來說是一個挑戰。

還是有一個簡單的命令/標誌來實現這個目的?

route 命令似乎可以解決問題(awk 欄位提取!!),但它沒有列出非活動介面。

終於找到了基於 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 }   }'

在這裡,如果我找到兩個連續的介面名稱,那麼我會列印帶有自定義消息“未分配”的前一個介面的名稱。如果我在字元串中獲得數字模式,則列印目前****字元串( ipaddress)以及前一個介面名稱!

如果您正在執行 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雖然需要。

引用自:https://unix.stackexchange.com/questions/183760