Is there an easy way to programmatically extract IP address?
NOTES
NIC device handles
The examples below assume that the network interface is a wireless card named
wlan0
. Adjust this bit in the examples for your particular situation. For example if it's a wired NIC card, then it's likelyeth0
.IPv4 - (Internet Protocol version 4)
Also these examples are returning the IPv4 address. the "dotted quad" that most people identify as their "IP Address".
For example:
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
IPv6 - (Internet Protocol version 6)
If your system is configured to support IPv6 you'll see both the "dotted quad" as well as the IPv6 IP addresses in the
ifconfig
output.For example:
inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link
The commands below explicitly ignore this, but could be adapted quite easily to grab this information instead.
Solutions (using ifconfig
)
There are many ways to do this. You could for example use this awk
script to parse out the IP address of your wireless LAN NIC (wlan0):
$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20
You can do this and make it more compact:
$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20
You could also do it using perl
:
$ ifconfig wlan0 | perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20
The Perl example is about as compact as it can get.
There are countless other ways to do this, these are just a couple of examples to get you started.
EDIT #1
Some additional notes and comments. @StephaneChazelas demonstrated that there is an even more compact version using grep
:
$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20
This solution makes use of grep
's ability in newer versions to make use of PCRE (Perl regular expressions), along with it's -o
switch to return just what matches the regular expression.
Solutions (using ip
)
As was also mentioned in the comments, ifconfig
can be troublesome to use on systems that have multiple IP addresses assigned to a network device, given it only returns the first one. So it's better to use the command ip
in these situations.
For example:
$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20
You can also tell ip
to only show you IPv4 information for a given network interface. In this case we're looking only at the interface named wlan0
:
$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20
References
- Golfing the Extraction of IP Addresses from ifconfig
- ip man page
- ifconfig man page
- PCRE man page
- grep man page
$ hostname -I
For example:
$ hostname -I
192.168.1.18
Info. from manpages:
http://manpages.ubuntu.com/manpages/raring/en/man1/hostname.1.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?hostname
Here is another one using "ip" but this works better when your device might be connected with different interfaces, such as wired Ethernet sometimes and WiFi other times. I also used "sed" instead of "grep" or "perl", for variety.
This finds whatever source IP has a route to the Internet. Or to Google's DNS at any rate.
ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$/\1/'