55

In Ubuntu, with command ifconfig -a, I obtain all the information about my ethernet/wifi interfaces.

But I need to obtain as output only the MAC address, like:

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

How can I obtain this?

5 Answers 5

122

You can access the address file for each device on the /sys virtual filesystem. The MAC address should be in /sys/class/net/<device-name>/address:

$ cat /sys/class/net/enp1s0/address
34:17:eb:5d:88:7c

For all devices:

$ cat /sys/class/net/*/address
34:17:eb:5d:88:7c
00:00:00:00:00:00
64:5a:04:69:50:45
7
  • 18
    +1 for not using a tool that's been deprecated for a decade :)
    – hobbs
    May 26, 2015 at 21:06
  • @hobbs Wait, which tool is that?
    – detly
    May 26, 2015 at 22:33
  • @detly ifconfig
    – hobbs
    May 26, 2015 at 22:33
  • 3
    @hobbs Woah. I was not aware of that. It does not print the deprecation warning on my machine.
    – detly
    May 26, 2015 at 22:35
  • 2
    @detly ifconfig's been deprecated for years now, and ip has also been around for years.
    – muru
    May 27, 2015 at 2:43
49

The easiest way would be to use grep with PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -P will enable us to use perl compatible Regex

  • grep -o will only take the matched portion of the line

  • We have matched HWaddr before our desired match (MAC addresses) and then discard HWaddr by \K to print only the MAC addresses.

@Helio has mentioned an important point, this is highly dependent on your language i.e. locale settings. To overcome that you can use the C locale (uses ASCII character set) for this command only:

$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
8
  • 2
    You may use LANG=C ifconfig -a instead of ifconfig -a for non-english installations, can be problems with grep. (i.e. In my system, HWaddr is direcciónHW)
    – 0x2b3bfa0
    May 26, 2015 at 11:32
  • @Helio what if you type: ifconfig -a | grep -i hw-*?
    – JoKeR
    May 26, 2015 at 15:06
  • 1
    @JoKeR just curious - is that -* supposed to mean something?
    – muru
    May 26, 2015 at 15:29
  • 2
    I have no HWaddr in my ifconfig output!
    – Owl
    Jun 21, 2019 at 9:58
  • 2
    On ubuntu 20.04, I found that HWaddr was swapped out with "ether" So I had to do ifconfig -a | grep -o 'ether [[:xdigit:]:]*' instead. Jun 4, 2020 at 18:25
13

Here are a few ways:

  1. grep. There are various regular expressions that will pick these up. Here, I am looking for 5 repetitions of 2 letters or numbers followed by a colon, then any two characters. The -i makes the match case insensitive and the -o makes grep print only the matched portion. -E enables extended regular expressions. The same regex also works with PCREs (-P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. The -n suppresses normal output and the -r enables extended regular expressions. Using the same regex as above, this script will attempt to replace everything on the line with the part of it that matches the regex. If the substitution was successful, the resulting line is printed (because of the p at the end of the substitution).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. If the line starts with a word character ([a-zA-Z0-9_]), and has 5 fields, print the last one.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl, where, as usual, there are more than one ways to do it. This one is the same logic as the awk above. The -a tells perl to split each input line into the @F array.

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

    Alternatively, you can use the regex from the previous approaches:

    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
    
10

As some have commented, ifconfig is deprecated in favor of the ip command. So combining the various solutions and comments, I'd use:

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

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

If your system output is non-English in this command, then it makes sense to run it this way.

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

This is applicable to all solutions.

7
  • 5
    Instead of using grep separately you could filter with awk directly like this: ifconfig -a | awk '/HWaddr/ { print $5 }'
    – krt
    May 26, 2015 at 11:21
  • Yes, there are really lots of ways to get this done.
    – Pilot6
    May 26, 2015 at 11:27
  • 2
    You may use LANG=C ifconfig -a instead of ifconfig -a for non-english installations, can be problems with grep. (i.e. In my system, HWaddr is direcciónHW)
    – 0x2b3bfa0
    May 26, 2015 at 11:31
  • Good notice. But in my Russian installation it is still HWaddr.
    – Pilot6
    May 26, 2015 at 11:33
  • Your Russian installation may be, but my Spanish installation doesn't. ;-) It can be a huge problem. Please, put @Helio at the begin of the comment. If not, I won't be notified.
    – 0x2b3bfa0
    May 26, 2015 at 11:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.