在 Ubuntu 上仅输出 MAC 地址

在 Ubuntu 上仅输出 MAC 地址

在 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

最简单的方法是使用grepPCRE:

$ 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

以下是几种方法:

  1. grep。有各种正则表达式可以找到这些。在这里,我要查找 5 个重复的 2 个字母或数字,后跟一个冒号,然后是任意两个字符。使-i匹配不区分大小写,使-ogrep打印匹配的部分。-E启用扩展正则表达式。相同的正则表达式也适用于 PCRE(-P)。

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed-n禁止正常输出, 启用-r扩展正则表达式。使用与上面相同的正则表达式,此脚本将尝试用与正则表达式匹配的部分替换行上的所有内容。如果替换成功,则打印结果行(因为p替换末尾有)。

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. 如果该行以单词字符 ( [a-zA-Z0-9_]) 开头,并且有 5 个字段,则打印最后一个字段。

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. 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'
    
  5. 核心实用程序。

    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}'

这适用于所有解决方案。

相关内容