Print mac address to file
Solution 1
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
Solution 2
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.
Edit: Updating 10 years later: ip
now has the -j
flag for JSON output, and when combined with jq
, it provides a more robust and readable command pipeline:
ip -j link show dev eth0 | jq -r '.[0].address'
The -r
flag to jq
makes it output a raw string instead of a quoted (JSON) string.
Solution 3
#! /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.
Related videos on Youtube
michelemarcon
Hello, I'm a Java software engineer. I also have some Android and Linux experience.
Updated on September 18, 2022Comments
-
michelemarcon over 1 year
With a bash script, can I read the mac address of my eth0 and print it to a file?
-
michelemarcon about 13 yearsI don't have perl on my system... :( However, +1
-
Keith about 13 yearsYou can also use th
ip
command:/sbin/ip link show eth0
. -
Michael Mrozek about 13 years@Keith I don't have that command, I'm not sure which package it's in; I think
ifconfig
is fairly standard -
Keith about 13 years@Michael On Linux anyway, it is the preferred tool. In fact you must use to configure some advanced features. But ifconfig lives on...
-
user unknown about 13 yearsThe 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. -
Michael Mrozek about 13 years@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 -
user unknown about 13 yearsYes, if you're the AWK-type. I'm the sed-type, but would here prefer an
| head -n 1
then. -
camh about 13 years@michelemarcon: This does not use perl. It uses recent GNU grep and grep has an option for using perl-style regular expressions.
-
michelemarcon about 13 yearsI have busybox grep, thanks however for the clarification. +1
-
IsaacS over 9 yearsI know this is Unix & Linux community but this also works on QNX 6.5.