在 Ubuntu 上只输出 MAC 地址

sim*_*994 51 command-line networking

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

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

ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到这个?

mur*_*uru 117

您可以访问虚拟文件系统address上每个设备的/sys文件。MAC 地址应该在/sys/class/net/<device-name>/address

$ cat /sys/class/net/enp1s0/address
34:17:eb:5d:88:7c
Run Code Online (Sandbox Code Playgroud)

对于所有设备:

$ cat /sys/class/net/*/address
34:17:eb:5d:88:7c
00:00:00:00:00:00
64:5a:04:69:50:45
Run Code Online (Sandbox Code Playgroud)

  • +1 表示未使用已弃用十年的工具:) (18认同)
  • @hobbs 哇。我不知道。它不会在我的机器上打印弃用警告。 (3认同)
  • @detly ifconfig 现在已被弃用 * 年 *,并且 `ip` 也已经存在多年。 (2认同)

hee*_*ayl 47

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

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
Run Code Online (Sandbox Code Playgroud)
  • 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  
Run Code Online (Sandbox Code Playgroud)

  • 在 ubuntu 20.04 上,我发现 HWaddr 被“ether”替换,所以我必须执行`ifconfig -a | grep -o 'ether [[:xdigit:]:]*'` 代替。 (3认同)
  • 对于非英语安装,您可以使用 `LANG=C ifconfig -a` 而不是 `ifconfig -a`,grep 可能会出现问题。(即在我的系统中,`HWaddr` 是 `direcciónHW`) (2认同)
  • 我的 ifconfig 输出中没有 HWaddr! (2认同)

ter*_*don 13

这里有几个方法:

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

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
    Run Code Online (Sandbox Code Playgroud)
  2. sed. 在-n抑制正常的输出和-r允许扩展正则表达式。使用与上面相同的正则表达式,该脚本将尝试用匹配正则表达式的部分替换该行上的所有内容。如果替换成功,则打印结果行(因为p替换结束)。

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

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
    Run Code Online (Sandbox Code Playgroud)
  4. Perl,像往常一样,有不止一种方法可以做到。这个和awk上面的逻辑是一样的。将-a告诉Perl每个输入行分成@F数组。

    ifconfig -a | perl -lane 'if(/^\w/&&$#F==4){print $F[$#F]}'
    
    Run Code Online (Sandbox Code Playgroud)

    或者,您可以使用之前方法中的正则表达式:

    ifconfig -a | perl -lne '/(([a-z0-9]{2}:){5}..)/ && print $1'
    
    Run Code Online (Sandbox Code Playgroud)
  5. 核心工具。

    LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
    
    Run Code Online (Sandbox Code Playgroud)


use*_*726 10

正如一些人所评论的那样,ifconfig不推荐使用该ip命令。因此,结合各种解决方案和评论,我会使用:

$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF
Run Code Online (Sandbox Code Playgroud)


Pil*_*ot6 5

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

如果您的系统输出在此命令中是非英语,那么以这种方式运行它是有意义的。

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

这适用于所有解决方案。

  • 您可以直接使用“awk”进行过滤,而不是单独使用“grep”,如下所示:“ifconfig -a | awk '/HWaddr/ { print $5 }'` (5认同)
  • 对于非英语安装,您可以使用“LANG=C ifconfig -a”而不是“ifconfig -a”,这可能会出现 grep 问题。(即在我的系统中,“HWaddr”是“directionHW”) (2认同)