Ifconfig
通過單個命令(管道)列印 interface-ipaddress
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
雖然需要。