29

If I want to display the IP address that is assigned to eth1, how can I do this in Bash?

red0ct
  • 394
  • 3
  • 11
user47556
  • 509
  • 1
  • 5
  • 11

12 Answers12

22

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}'

pstanton
  • 623
  • 3
  • 11
  • 23
17

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.

user9517
  • 115,471
  • 20
  • 215
  • 297
  • 2
    worked also ifconfig eth1| awk -F ' *|:' '/inet addr/{print $4}' – user47556 Oct 27 '10 at 11:37
  • 1
    On *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
    ip addr show eth1| grep inet|awk '{print $2;}' – navaho Aug 16 '11 at 22:18
14

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}'
Jason H.
  • 149
  • 1
  • 5
9

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
red0ct
  • 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
  • @copycat What is the need to ping your own interface? – red0ct Jan 18 '22 at 13:14
  • "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
9

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]*"
Manuel
  • 99
  • 1
  • 2
2

Works well on various linux:

ip -brief address show eth0 | awk '{print $3}' | awk -F/ '{print $1}'
tbo47
  • 121
  • 1
2

maybe this will help

ifconfig eth1
1

on Ubuntu 20.04

$ sudo apt install moreutils
$ ifdata -pa eth0
192.168.1.152

3r1d
  • 111
  • 1
0

This is what I use:

ip r s | awk '/eth0/ {print $7}'

will print, for example: 192.168.0.1

lepe
  • 469
  • 2
  • 6
  • 25
0

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

0

One liner with sed:

ifconfig wlan0 | sed -En -e 's/.*inet ([0-9.]+).*/\1/p'

Replace wlan0 with the desired interface.

bleater
  • 121
  • 3
0

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.

Michael Hampton
  • 244,070
  • 43
  • 506
  • 972
  • 1
    As 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