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.

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.

share|improve this question
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. –  bl4ck5un Dec 1 '13 at 6:18
    
What OS are you running? –  Mat Dec 1 '13 at 7:33
    
@Mat Mac OS X Mavericks. –  bl4ck5un Dec 1 '13 at 8:24

4 Answers 4

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.

share|improve this answer
    
Great regex, works like a charm. Thanks! –  Ain Tohvri Jun 27 at 15:22

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.

share|improve this answer
    
Thanks but where is active consideration ? –  bl4ck5un 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'. –  son_of_fire Dec 27 '13 at 17:14

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
share|improve this answer
$ 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.
share|improve this answer

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.