我使用以下命令获取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
答案 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