Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

With a bash script, can I read the mac address of my eth0 and print it to a file?

share|improve this question
add comment

3 Answers

up vote 10 down vote accepted

ifconfig will output information about your interfaces, including the MAC address:

$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:11:22:33:44:55  
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:289748093 errors:0 dropped:0 overruns:0 frame:0
          TX packets:232688719 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3264330708 (3.0 GiB)  TX bytes:4137701627 (3.8 GiB)
          Interrupt:17 

The HWaddr is what you want, so you can use awk to filter it:

$ ifconfig eth0 | awk '/HWaddr/ {print $NF}'
00:11:22:33:44:55

Redirect that into a file:

$ ifconfig eth0 | awk '/HWaddr/ {print $NF}' > filename
share|improve this answer
2  
You can also use th ip command: /sbin/ip link show eth0. –  Keith Apr 18 '11 at 20:39
2  
@Michael On Linux anyway, it is the preferred tool. In fact you must use to configure some advanced features. But ifconfig lives on... –  Keith Apr 18 '11 at 20:55
3  
The international approach is LC_ALL=C ifconfig eth0 | awk '/HWaddr/ {print $NF}', because the output might be localized, not matching 'HWaddr'. LC_ALL=C uses the international standard. –  user unknown Apr 19 '11 at 0:21
2  
@user Ah, cool. As far as I know it'll always be the first line, so you could just get away with awk '{print $NF; exit}' too –  Michael Mrozek Apr 19 '11 at 0:31
1  
Yes, if you're the AWK-type. I'm the sed-type, but would here prefer an | head -n 1 then. –  user unknown Apr 19 '11 at 3:53
show 1 more comment
#! /bin/sh

/sbin/ifconfig eth0 | perl -ne 'print "$1\n" if /HWaddr\s+(\S+)/' >file

There are other tools that could cut the MAC address out of ifconfig's output, of course. I just like Perl.

share|improve this answer
1  
I don't have perl on my system... :( However, +1 –  michelemarcon Apr 18 '11 at 15:44
add comment

Here's a modern Linux method:

ip -o link show dev eth0 | grep -Po 'ether \K[^ ]*'

It's modern in that ifconfig has long been deprecated in favour of ip from the iproute2 package, and that grep has the -P option for perl regular expressions for the zero-width positive look-behind assertion.

grep -o is nice for text extraction. sed is traditionally used for that but I find the perl-style zero-width assertions clearer than a sed substitution command.

You don't actually need the -o (oneline) option to ip, but I prefer to use it when extracting network information since I find it cleaner having one record per line. If you're doing more complicated matches or extractions (usually with awk), -o is essential for a clean script, so for the sake of consistency and a common pattern, I always use it.

share|improve this answer
1  
@michelemarcon: This does not use perl. It uses recent GNU grep and grep has an option for using perl-style regular expressions. –  camh Apr 19 '11 at 13:18
    
I have busybox grep, thanks however for the clarification. +1 –  michelemarcon Apr 19 '11 at 13:20
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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