I need to create a script that outputs the internal IP address, that is configured as the default Interface.

  • Do you mean the one used for sending to the default gateway? – Hauke Laging Nov 9 '14 at 18:02
  • possible duplicate of How can I get my external IP address in bash? – jasonwryan Nov 9 '14 at 18:03
  • 1
    @jasonwryan not a dupe (or not a dupe of that one anyway), the OP wants the internal IP, not the external. – terdon Nov 9 '14 at 18:11
  • Hauke, this might be it, if the interpretation of the "default" value from the route command is that that is. – Marcello de Sales Nov 9 '14 at 18:11
  • 1
    @MarcellodeSales no, it has no dependencies. It is just looking for something different. You are showing how to get the IP of a machine in the internal network while the dupe is about getting the external IP. Two very different things. Jason was confused because your original question was asking for a "public" IP which is not what your answer returns. – terdon Nov 9 '14 at 18:17

Here's another slightly terser method using procfs (assumes you're using Linux):

default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'

This returns both the IPv4 and (if available) the IPv6 address of the interface. You can change the test if you only want one or the other (look for inet for IPv4, and inet6 for IPv6).

$ default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
$ ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'
$ ip addr show dev "$default_iface" | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }'
$ ip addr show dev "$default_iface" | awk '$1 == "inet6" { sub("/.*", "", $2); print $2 }'

Lots of good answers here, but wanted to throw in my usual approach:

The simplest solution is to get the route for a public internet address:

$ ip route get | grep -oP 'src \K\S+'

Another solution is to get the default gateway, and then get the IP addr used to communicate with that gateway:

$ ip route get $(ip route show | grep -oP 'via \K\S+') | grep -oP 'src \K\S+'

Here's what I wrote:

  1. Get the default interface from the "route" command.

It will print out which interface is the "default". For my host, I need to get the last column of the default line.

[root@pppdc9prd3ga mdesales]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface     *        U     0      0        0 bridge0     *        U     0      0        0 eth4
link-local      *          U     1002   0        0 eth4
link-local      *          U     1003   0        0 bridge0
default         UG    0      0        0 eth4
  1. Use "ifconfig" to retrieve the IP address of that interface.

Just getting the addr: value.

[root@pppdc9prd3ga mdesales]# ifconfig eth4
eth4      Link encap:Ethernet  HWaddr 00:50:56:01:42:91  
          inet addr:  Bcast:  Mask:
          RX packets:1346288 errors:0 dropped:0 overruns:0 frame:0
          TX packets:438844 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:276243478 (263.4 MiB)  TX bytes:116188062 (110.8 MiB)

So here's the script I came up with.

defaultInterface=$(route | grep default | awk '{print $(NF)}')
ifconfig $defaultInterface | grep 'inet addr:' | cut -d: -f2 |  awk '{ print $1}'

Here's it executing:

  • Nice, +1. You could simplify (well, shorten it anyway) that to ifconfig $(route | grep -oP '^default.*\s+\K.*') | grep -oP 'inet addr:\K[^\s]+') – terdon Nov 9 '14 at 18:15
  • If you're going to do this on Linux, you might consider using procfs instead of parsing :-) – Chris Down Nov 9 '14 at 18:26
  • @ChrisDown... would that be via /proc/net? Yeah, this is for a Docker cluster. – Marcello de Sales Nov 9 '14 at 18:39
  • @MarcellodeSales Yeah, /proc/net/route. I've posted an answer to that effect. – Chris Down Nov 9 '14 at 18:51

If what you want is the IP address assigned to the default interface (which is what I understood from the comments under the question), using the Swiss army knife of network setup (ip) should be enough:

$ ip route | grep '^default'
default via dev eth1  metric 203 
$ ip addr show eth1
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether c0:de:f1:72:30:48 brd ff:ff:ff:ff:ff:ff
    inet brd scope global eth1
       valid_lft forever preferred_lft forever

This shortens to

$ ip addr show \
    $( /sbin/ip route \
        | grep '^default'\
        | sed 's/^.*dev \([^ \t]*\) .*$/\1/' )

which is ugly, because it is parsing something that probably wasn't really meant to be parsed (output of ip route), but should work.


My favorite one is following.

Get the default interface:

$ ip r | grep -oP 'default .* \K.+'

Get the ip of an interface:

$ ip a show eth0 | grep -oP 'inet \K[\d\.]+'


$ ip a show $(ip r | grep -oP 'default .* \K.+') | grep -oP 'inet \K[\d\.]+'

Simple Command with default interface.

ip route | grep src | awk '{print $NF; exit}'

Tested on All Unix OS


This worked for me on Centos 7. Find default interface using ip

ifconfig $(ip route | awk '/default/ { print $5 }') | grep "inet " | awk '{print $2}'

Any Linux OS-es using /proc (but without using iproute tools):

cat /proc/net/fib_trie|grep -A50 '\|-- 0\.0\.0\.0$'|grep -B50 -wm1 'LOCAL'|tail -n2|grep -oP '\|-- \K\S+'

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.