从ifconfig的输出中提取MAC地址的最佳方法是什么?
从ifconfig
的输出中提取MAC地址的最佳方法是什么?
示例输出:
bash-3.00# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 1F:2E:19:10:3B:52 inet addr:127.0.0.66 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .... ....
我应该使用cut, AWK还是其他的方法,以及一种方法的优点和缺点。
你可以在/sys/class/
cat /sys/class/net/*/address
特别为eth0
cat /sys/class/net/eth0/address
我会用:
ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
-o将导致grep只打印与expression式匹配的部分。 [[:xdigit:]]{1,2}
将匹配1或2个hex数字(Solaris不输出前导零)。
我喜欢使用/ sbin / ip来处理这些types的任务,因为parsing起来要容易得多:
$ ip link show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:30:21:48 brd ff:ff:ff:ff:ff:ff
你可以用awk从这个输出中得到这个mac地址:
$ ip link show eth0 | awk '/ether/ {print $2}' 00:0c:29:30:21:48
如果你想多花点功夫,parsing更多的数据,我build议使用ip命令的-online参数,这样可以让你把每一行当作一个新的设备:
$ ip -o link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue \ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000\ link/ether 00:0c:29:30:21:48 brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000\ link/ether 00:0c:29:30:21:52 brd ff:ff:ff:ff:ff:ff 4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 100\ link/[65534] 5: sit0: <NOARP> mtu 1480 qdisc noop \ link/sit 0.0.0.0 brd 0.0.0.0
不知道是否真的有什么优势,但你可以简单地使用awk:
ifconfig eth0 | awk '/HWaddr/ {print $5}'
由于OP的示例引用了Bash,因此可以在不使用其他工具的情况下提取HWaddr等字段:
x=$(ifconfig eth0) && x=${x#*HWaddr } && echo ${x%% *}
在第一步中,将ifconfig的输出分配给x。 第二步删除“HWaddr”之前的所有内容。 在最后一步,“”(MAC后面的空格)被删除。
参考: http : //www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
我更喜欢这里描述的方法(稍作修改): http : //www.askdavetaylor.com/how_do_i_figure_out_my_ip_address_on_a_mac.html
ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d " " -f2
然后,您可以将其replace为简短的“myip”命令以供将来使用:
echo "alias myip=\"ifconfig | grep 'inet ' | grep -v 127.0.0.1 | cut -d ' ' -f2\"" >> ~/.bash_profile
ifconfig | grep HW | awk '{print $5}'
对于Rhat或CentOs,请尝试ip add | grep link/ether | awk '{print $2}'
ip add | grep link/ether | awk '{print $2}'
在Ubuntu 14.04terminal
ifconfig | grep HW
这个怎么样:
ifconfig eth0 | grep -Eo ..\(\:..\){5}
或更具体地说
ifconfig eth0 | grep -Eo [:0-9A-F:]{2}\(\:[:0-9A-F:]{2}\){5}
也是一个简单的
ifconfig eth0 | head -n1 | tr -s ' ' | cut -d' ' -f5`
注意:在OS X上,eth0可能不起作用。 使用p2p0:
ifconfig p2p0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
这适用于我在Mac OS X上:
ifconfig en0 | grep -Eo ..\(\:..\){5}
那么:
ifconfig en0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
两者都是上述示例的变体。
又好又快:
ifconfig eth0 | grep HWaddr | cut -d ' ' -f 11
ifconfig | grep -i hwaddr | cut -d ' ' -f11
我需要获得活动适配器的MAC地址,所以最终使用这个命令。
ifconfig -a | awk '/^[az]/ { iface=$1; mac=$NF; next } /inet addr:/ { print mac }' | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
希望能帮助到你。
输出ifconfig:
$ifconfig eth0 Link encap:Ethernet HWaddr 00:1b:fc:72:84:12 inet addr:172.16.1.13 Bcast:172.16.1.255 Mask:255.255.255.0 inet6 addr: fe80::21b:fcff:fe72:8412/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:638661 errors:0 dropped:20 overruns:0 frame:0 TX packets:93858 errors:0 dropped:0 overruns:0 carrier:2 collisions:0 txqueuelen:1000 RX bytes:101655955 (101.6 MB) TX bytes:42802760 (42.8 MB) Memory:dffc0000-e0000000 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:16436 Metric:1 RX packets:3796 errors:0 dropped:0 overruns:0 frame:0 TX packets:3796 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:517624 (517.6 KB) TX bytes:517624 (517.6 KB)
提取MAC地址的最佳方法是:
ifconfig | sed '1,1!d' | sed 's/.*HWaddr //' | sed 's/\ .*//' | sed -e 's/:/-/g' > mac_address
使用:
ifconfig eth0 | grep HWaddr
要么
ifconfig eth0 |grep HWaddr
这将只拉MAC地址,没有别的。
你可以改变你的MAC地址为任何你想要的:
ifconfig eth0 down, ifconfig eth0 hw ether (new MAC address), ifconfig eth0 up