By default ifconfig will show me all available interfaces , but what if I just want to display active ones? Like, en0 only in below.

    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

Notice ifconfig en0 will not satisfy, en0 is not always the active one ;)

I'm running Mac OS X.

  • 2
    Your OS would be something important to mention since ifconfig implementations vary. Also, why is the use ifconfig a requirement? What is your end goal? – jordanm Dec 1 '13 at 6:01
  • Hi @jordanm, my goal is to to get IP address of currently active interface, often a wireless or wired Ethernet interface. – qweruiop Dec 1 '13 at 6:18
  • how do you define the active interface? – AnonymousLurker Dec 4 '18 at 18:43

To get a complete description of all the active services, try:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

This simple regex should filter out only active interfaces and all their information. I sugest you put an alias for this in your ~/.profile or ~/.bash_profile file (maybe ifconfiga?)

To just get the interface name (useful for scripts), use:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

You have to install pcregrep for this to work. It's on macports in the pcre package. Alternatively, this should work with GNU grep using grep -Pzo instead of pcregrep -M -o but with the rest the same, but I haven't tested this.


If you only want to print the “entry” if it contains status: active, then you could use something like this awk program as a filter to the ifconfig output:

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

When each “entry” starts (a line is empty or does not start with a Tab), start saving the entry in a buffer. Append to this buffer any subsequent lines that start with a Tab. Watch for the magic string status: active; if a line like that was seen, print out the buffer (the previous “entry”) when a new “entry” starts (or the input ends).

Save the above program text in a file and use it like this:

ifconfig -a | awk -f /path/to/file

Or, if you chmod +x the file, then you can simplify it a bit:

ifconfig -a | /path/to/file

Reading your comments and question, it seems you actually want to just get the interfaces that have an IP address assigned to them.

You can do this quickly with ifconfig and grep.

Running the command:

ifconfig | grep 'Link\|inet'

Should produce something similar to:

eth0      Link encap:Ethernet  HWaddr 00:11:22:33:44:55
eth1      Link encap:Ethernet  HWaddr 00:11:22:33:44:66  
          inet addr:  Bcast:  Mask:
lo        Link encap:Local Loopback  
          inet addr:  Mask:

This would show each line with a interface name and and IP if they had one.

Some more specific REGEX magic might get you exactly what you need.

  • 2
    Thanks but where is active consideration ? – qweruiop Dec 1 '13 at 15:22
  • if there is a line after the interface, then it has an IP address assigned to it, and by what I gather you mean, it would constitute as 'active'. – Nathan McCoy Dec 27 '13 at 17:14

If you are not adverse to some bash scripting, you can do this:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

That's will list out the active network interfaces. Tested on Mac OS X 10.13.

The nice thing is that you don't need to install anything. Just run the above in a Terminal.


Following will print out only those interfaces that are configured to have an IP

ifconfig | grep "inet.*broadcast"

Get ACTIVE interface MAC only:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
$ ifconfig | grep "inet addr:" | grep -v | sed -e 's/Bcast//' | cut -d: -f2

How it works:

  • ifconfig
  • Grep for lines containing "inet addr"
    • These lines contains the IPs.
  • Grep for lines that do not contain ""
    • We usually do not care about localhost.
    • -v is inverted grep
  • From remaining lines, remove the "Bcast"
  • Cut field 2 using ":" as a delimiter
    • Prints the answer.
ifconfig en0 | grep status

This will show the status of the ethernet connection en0

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.