22

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

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    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 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    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
24

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 ifactive?)

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.

2

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
2

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.

  • This should be the best answer, however ifconfig -lu will not work on debian. But OP is using MacOS anyway, so this solution would work on systems with BSD's ifconfig. I posted another answer below which does the same without using ifconfig -lu – Rakib Fiha Nov 28 at 10:11
1

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:192.168.0.8  Bcast:192.168.0.255  Mask:255.255.255.0
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

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
1

I wish the question was a bit clearer. Assuming that by Active interface only, you meant to show the name of active interfaces only (In my case UP and RUNNING status active) without any other details. Then try this:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

The output would look like:

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

Adjust the grep -v field and add in more unwanted interfaces like loopback --> lo etc, if necessary.

Now, if you want and you would need to check whether the interfaces found are active at present. Then we can just simply pass them as an argument for ifconfig <interface> like shown below:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

Simplifying this further and implementing it in a function:

checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}

Executing this function will return only the active interfaces. In my case:

awdl0
en0
llw0
0

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

ifconfig | grep "inet.*broadcast"
0

Get ACTIVE interface MAC only:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
-1
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | 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 "127.0.0.1"
    • 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.
-1
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.