If I want to display the IP address that is assigned to eth1, how can I do this in Bash?
12 Answers
As @Manuel mentioned, ifconfig
is out of date, and ip
is the recommended approach going forward.
ip -f inet addr show eth1
and to use @bleater's sed or @Jason H.'s awk to filter the output (depending on if you want the mask)
ip -f inet addr show eth1 | sed -En -e 's/.*inet ([0-9.]+).*/\1/p'
ip -f inet addr show eth1 | awk '/inet / {print $2}'

- 623
- 3
- 11
- 23
-
This answer is also fit if you need only IPv4-addresses. – red0ct Nov 11 '20 at 14:54
-
`ip -f inet6 addr show eth1 | sed -En -e 's/.*inet6 ([0-9a-fA-F:]+).*/\1/p'` for ipv6 – Adriel Santos Jun 30 '22 at 14:39
-
`ip -f inet addr show lo | awk '/inet / {print $2}'` gives me `127.0.0.1/8`, not the desired `127.0.0.1`. – Abdull Oct 31 '22 at 10:40
-
```ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1``` if you don't like sed – MoonRaiser Feb 13 '23 at 12:02
Try this (Linux)
/sbin/ifconfig eth1 | grep 'inet addr:' | cut -d: -f2| cut -d' ' -f1
or this (Linux)
/sbin/ifconfig eth0 | awk -F ' *|:' '/inet addr/{print $4}'
or this (*BSD)
ifconfig bge0 | grep 'inet' | cut -d' ' -f2
or this (Solaris 10)
ifconfig e1000g0 | awk '/inet / {print $6}'
Obviously change the interface name to match the one you want to get the information from.

- 115,471
- 20
- 215
- 297
-
2
-
1On *BSD systems the ifconfig output is a bit different - `ifconfig bge0 | grep 'inet' | cut -d' ' -f2` will work (substitute your appropriate interface name in place of `bge0`, obviously) – voretaq7 Aug 15 '11 at 18:08
-
1
On a Linux system:
hostname --all-ip-addresses
will give you only the IP address.
On a Solaris system use:
ifconfig e1000g0 | awk '/inet / {print $2}'

- 149
- 1
- 5
-
2From the hostname(1) man page: `Avoid using this option; use hostname --all-ip-addresses instead.` – bleater Nov 14 '17 at 01:06
-
To obtain both IPv4 and IPv6 IP addresses with netmasks just try:
ip a l eth1 | awk '/inet/ {print $2}'
Or without netmasks (can't imagine why you need an IP address without a mask):
ip a l eth1 | awk '/inet/ {print $2}' | cut -d/ -f1

- 394
- 3
- 11
-
3"can't imagine why you need an IP address without a mask" Simple, there's very few clients that support it. You can't ping 1.1.1.1/32. https://1.1.1.1/32 would return a 404. You can't point an A record to it, nor insert it into a reverse proxy config, nor tunnel to it, nor put it into /etc/hosts. – copycat Mar 03 '21 at 01:46
-
-
"l" stands for list (not documented in inline help (iproute2 version 5.5.0), only documented in manpage). – 3r1d Jul 27 '23 at 03:33
A better way: get ip adress from command "ip", because "ifconfig" is out of date. Otherwise you will get a problem on using "ifconfig", because the output of ifconfig is language dependend.
I use this command to get all IPs (IPv4):
ip addr show | grep -o "inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"

- 99
- 1
- 2
-
1`ifconfig` has the advantage of existing on systems that aren't Linux... – voretaq7 Dec 07 '12 at 03:59
-
1
Works well on various linux:
ip -brief address show eth0 | awk '{print $3}' | awk -F/ '{print $1}'

- 121
- 1
This is what I use:
ip r s | awk '/eth0/ {print $7}'
will print, for example: 192.168.0.1

- 469
- 2
- 6
- 25
On MacOS I use ipconfig getifaddr <interface-name>
The command is listed under the BSD System Manager's Manual
.

- 1
One liner with sed:
ifconfig wlan0 | sed -En -e 's/.*inet ([0-9.]+).*/\1/p'
Replace wlan0 with the desired interface.

- 121
- 3
I tried the accepted answer on CentOS 7, but it does not work.
/sbin/ifconfig eth0 | grep 'inet ' | tr -s ' ' | cut -d" " -f3
worked for me, in case someone else is also running into the same problem.

- 244,070
- 43
- 506
- 972

- 11
-
1As mentioned by @Manuel and @pstanton, `ifconfig` should be avoided. It's actually removed in some newer distros. This is probably why your answer was downvoted. – Server Fault May 10 '18 at 19:30