将localhost的IP和MAC地址添加到shell脚本

时间:2014-08-28 17:56:34

标签: shell networking awk grep arp

我使用以下命令获取arp表。我现在想要将localhost的ip和MAC地址添加到输出中。我该如何编写shell脚本?

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

所以结果如下所示(它将iface和host 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

获取本地接口的MAC和IP地址信息的最简单方法是“ifconfig&#39;命令,通常位于&#39; / sbin / ifconfig&#39;。 就我而言,我使用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)

获得所需输出的最简单示例使用echo / 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}'

<强>梗概:

使用&#39; -o&#39; grep中的选项将仅输出 在行内匹配的内容,而不是行本身。

&#39; -E&#39;告诉grep期望一个&#34;扩展的正则表达式&#34;在匹配标准中。在这种情况下,我们正在寻找以&#34; HWaddr&#34;开头的条目。或者&#34; inet addr:&#34;,然后是字符&#39; 0-9&#39;,&#39; a-z&#39;,&#39; A-Z&#的任意组合39;,&#39;:,或&#39;。&#39;。

如果你在那里结束命令,你会留下两行看起来像&#34; HWaddr 86:75:30:9a:09:87&#34;和&#34; inet addr:10.20.30.40&#34;。

我们只需要MAC和IP地址,因此我们告诉sed摆脱&#34; HWaddr&#34;和&#34; inet addr:&#34;从行的开头(&#39; ^&#39;表示开头)。

通过将此命令的输出包装在&#39; $()&#39;中来捕获该命令的输出使两条线成一条线,用空格分隔。将此添加到回声&#39;命令允许我们使用awk用&#39; *&#39;替换空格,使最终输出类似于原始&#39; arp | AWK&#39;命令呢。

我们剩下的就是:

# 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