在Ubuntu上仅输出MAC地址


36

在Ubuntu中,使用command ifconfig -a,可以获得有关我的以太网/ wifi接口的所有信息。

但我需要得到作为输出 MAC地址,如:

ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef

我如何获得这个?

Answers:


39

最简单的方法是grep与PCRE 一起使用:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -P将使我们能够使用perl兼容的Regex

  • 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  

2
您可能会使用grep LANG=C ifconfig -a而不ifconfig -a是非英语安装,而不是非英语安装。(即在我的系统中HWaddrdirecciónHW
Helio

@Helio如果你键入:ifconfig -a | grep -i hw-*
2015年

1
@JoKeR只是很好奇-这-*应该意味着什么吗?
muru

@muru真的不是我感到困惑,我以为他找不到,HW但是HWaddr我说/看得出他说了西班牙语,direcciónHW所以就这么简单HW;)
JoKeR 2015年

Perl regex是grep“高度实验性的”。如果要使用基本的正则表达式,则等效命令为ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'或(如果愿意)ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'。我省略了结尾,$因为输出在MAC地址之后包含空格,并且您可能不希望这些空格。
帕迪·兰道

67

您可以访问虚拟文件系统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

6
+1未使用已弃用十年的工具:)
hobbs 2015年

@hobbs等待,那是哪个工具?
精美地

@detly使用ifconfig
霍布斯

1
@hobbs哇。我没有意识到。它不会在我的机器上打印弃用警告。
2015年

1
@detly ifconfig已经被弃用了很多,并且ip已经存在了很多年。
muru

11

以下是几种方法:

  1. grep。有各种各样的正则表达式可以帮助您解决这些问题。在这里,我正在寻找2个字母或数字的5个重复项,后跟一个冒号,然后是任意两个字符。所述-i使匹配不区分大小写和-o品牌grep只打印匹配的部分。-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. Coreutils。

    LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
    

5

正如某些人评论的那样,ifconfig不赞成使用该ip命令。因此,结合使用各种解决方案和评论,我将使用:

$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF

4

ifconfig -a | grep HWaddr | awk '{print $5}'

如果此命令的系统输出为非英语,则以这种方式运行它是有意义的。

LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'

这适用于所有解决方案。


5
不必grep单独使用,您可以awk像这样直接过滤: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt 2015年

是的,确实有很多方法可以做到这一点。
飞行员

2
您可能会使用grep LANG=C ifconfig -a而不ifconfig -a是非英语安装,而不是非英语安装。(即在我的系统中HWaddrdirecciónHW
Helio

好的通知。但是在我的俄语安装中,它仍然是HWaddr。
飞行员

您的俄语安装可能是,但我的西班牙语安装却没有。;-)这可能是一个巨大的问题。请@Helio在评论的开头。如果没有,我将不会收到通知。
Helio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.