获取本地接口的 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)
获得所需输出的最简单示例使用组合 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}'
简介:
在 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