在 Ubuntu 中,使用命令ifconfig -a
,我可以获得有关以太网/wifi 接口的所有信息。
但我需要获得输出仅有的MAC 地址,例如:
ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef
我如何获得它?
答案1
您可以访问虚拟文件系统address
上每个设备的文件/sys
。MAC 地址应位于/sys/class/net/<device-name>/address
:
$ cat /sys/class/net/enp1s0/address
34:17:eb:5d:88:7c
对于所有设备:
$ cat /sys/class/net/*/address
34:17:eb:5d:88:7c
00:00:00:00:00:00
64:5a:04:69:50:45
答案2
最简单的方法是使用grep
PCRE:
$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
grep -P
将使我们能够使用perl
兼容的正则表达式grep -o
只会获取匹配的部分我们
HWaddr
在想要的匹配(MAC 地址)之前就已经匹配过了,然后HWaddr
通过\K
仅打印 MAC 地址来丢弃。
@Helio 提到了一个重要的观点,这在很大程度上取决于您的语言locale
设置。为了克服这个问题,您可以C
仅对此命令使用语言环境(使用 ASCII 字符集):
$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
答案3
以下是几种方法:
grep
。有各种正则表达式可以找到这些。在这里,我要查找 5 个重复的 2 个字母或数字,后跟一个冒号,然后是任意两个字符。使-i
匹配不区分大小写,使-o
仅grep
打印匹配的部分。-E
启用扩展正则表达式。相同的正则表达式也适用于 PCRE(-P
)。ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
sed
。-n
禁止正常输出, 启用-r
扩展正则表达式。使用与上面相同的正则表达式,此脚本将尝试用与正则表达式匹配的部分替换行上的所有内容。如果替换成功,则打印结果行(因为p
替换末尾有)。ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
awk
. 如果该行以单词字符 ([a-zA-Z0-9_]
) 开头,并且有 5 个字段,则打印最后一个字段。ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
Perl,像往常一样,有多种方法可以做到这一点。这个与
awk
上面的逻辑相同。-a
告诉 perl 将每个输入行拆分到@F
数组中。ifconfig -a | perl -lane 'if(/^\w/&&$#F==4){print $F[$#F]}'
或者,您可以使用以前的方法中的正则表达式:
ifconfig -a | perl -lne '/(([a-z0-9]{2}:){5}..)/ && print $1'
核心实用程序。
LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
答案4
ifconfig -a | grep HWaddr | awk '{print $5}'
如果您的系统在此命令中输出非英语,那么以这种方式运行它是有意义的。
LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'
这适用于所有解决方案。