2014-08-28 32 views
2

我使用以下命令獲取arp表。我現在想要將本地主機的ip和MAC地址添加到輸出中。我應該如何編寫shell腳本?將localhost的IP和MAC地址添加到shell腳本中

arp | grep -v 'incomplete' | tail -n+2 | awk '{print $1"*"$4}' 

所以結果看起來像下面(它增加了IFACE和主機的ip ARP表項的每一行)

eno16777736 192.168.140.133 192.168.140.254,00:50:56:ef:2d:57 
eno16777736 192.168.140.133 192.168.140.2,00:50:56:ea:cf:bf 
+0

你打算如何處理多個網卡?另外,'ip addr show'通常是一個好方法。 – 2014-08-28 18:15:02

回答

3

在我的系統,我可以這樣做:

arp | 
awk 'NR>1{mac[$NF]=mac[$NF]" "$3} END {for (iface in mac) print iface, mac[iface]}' | 
while read iface mac; do 
    inet=$(
     ifconfig "$iface" | 
     awk -v i=$iface '{for (j=1; j<NF; j++) if ($j == "inet") {print $(j+1); exit}}' 
    ) 
    echo $iface $inet ${mac// /,} 
done 
+0

但是如果你使用shell腳本,arp將會「找不到」 – 2014-08-28 18:20:46

+1

所以使用完整路徑,例如'/ usr/sbin/arp',或者做'PATH = $ PATH:/ usr/sbin' – 2014-08-28 18:22:08

+0

謝謝Glenn.It是非常接近我所需要的。我更新了預期結果的問題。 – 2014-08-29 06:08:49

0

獲取本地接口的MAC和IP地址信息的最簡單方法是'ifconfig'命令,通常位於'/ sbin/ifconfig'。 就我而言,我使用的爲wlan0作爲我的主界面:

# /sbin/ifconfig wlan0 
wlan0  Link encap:Ethernet HWaddr 86:75:30:9a:09:87 
      inet addr:10.20.30.40 Bcast:10.20.30.255 Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:1276663 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:820927 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1000 
      RX bytes:1233280913 (1.2 GB) TX bytes:105410513 (105.4 MB) 

最簡單的例子,以獲得您想要的輸出使用組合回波/ grep的/ SED/AWK:

echo $(/sbin/ifconfig wlan0 | \ 
grep -oE "(HWaddr\ |inet\ addr:)[0-9a-fA-F:\.]+" | \ 
sed 's/^\(HWaddr \|inet addr\:\)//') | \ 
awk '{print $2"*"$1}' 

簡介:

在grep的使用「-o」選項將輸出只有什麼是行內的匹配,而不是線路本身。

'-E'告訴grep期望在匹配條件中使用「擴展正則表達式」。在這種情況下,我們正在查找以「HWaddr」或「inet addr:」開始的條目,然後是字符'0-9','a-z','A-Z','或''。

如果在那裏結束該命令,則剩下兩行看起來像「HWaddr 86:75:30:9a:09:87」和「inet addr:10.20.30.40」。

我們只需要MAC和IP地址,所以我們告訴sed從行首開始('^'表示開始)拋棄「HWaddr」和「inet addr:」。

通過將該命令封裝在'$()'中捕獲該輸出的輸出將使兩行成爲一行,並用空格分隔。將這個添加到'echo'命令允許我們使用awk用'*'替換空格,使得最終的輸出類似於原始的'arp | awk'命令。

,我們還剩下什麼是這樣的:

# echo $(/sbin/ifconfig wlan0 | grep -oE "(HWaddr\ |inet\ addr:)[0-9a-fA-F:\.]+" | sed 's/^\(HWaddr \|inet addr\:\)//') | awk '{print $2"*"$1}' 
10.20.30.40*86:75:30:9a:09:87 

你也可以做到這一點在純bash腳本,通過使用其內置的正則表達式引擎:

# IFS=$'\n' echo $(IFS=$'\n'; 
for LINE in $(ifconfig wlan0); 
do if [[ "${LINE}" =~ .*(HWaddr\ |inet\ addr:)([0-9a-fA-F\:\.]+) || "${LINE}" =~ .*inet\ addr:([\d\.]+) ]]; 
then echo ${BASH_REMATCH[2]}; 
fi; done) | \ 
awk '{print $2"*"$1}' 
172.16.17.40*a0:88:b4:78:65:04 

...但它更痛苦的解釋:-P