What's the most concise way to resolve a hostname to an IP address in a Bash script? I'm using Arch Linux.

  • 27
    Shame that the getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname> answer is somewhere down there near the bottom. It's the simplest, requires no extra packages and is easier to parse from a Bash script, too. – 0xC0000022L Apr 29 '15 at 22:15
  • 1
    @0xC0000022L: The new shame is that that answer suggests getent hosts somehost, when running this while on somehost will produce an IPv6 address, which is different from how most other tools (ping, ssh at least) resolve names, and breaks some things. Use the ahosts instead of hosts. – j_random_hacker Jun 29 '18 at 12:46
  • 1
    @j_random_hacker: who keeps you from requesting specifically IPv4 (ahostsv4) or IPv6 (ahostsv6) addresses? Personally I find nothing wrong with the unspecific request returning IPv6. Your code should be prepared. IPv6 has been out there for more than 20 years now. – 0xC0000022L Jun 29 '18 at 14:15
  • 1
    @0xC0000022L: Nobody "keeps me" from doing that, but the answer specifically suggests hosts, and so far 4 people have upvoted vinc17's comment expressing the pain caused by "suddenly IPv6". Being prepared for IPv6 is not always the issue: many programs need a way to determine whether two names/addresses refer to the same host. They can either use simple string matching, or they must know a lot about the network to find the "true" answer. The latter is a minefield, so many 3rd-party programs and systems -- that I have no control over -- use the former. – j_random_hacker Jun 29 '18 at 15:08

26 Answers 26


You can use getent, which comes with glibc (so you almost certainly have it on Linux). This resolves using gethostbyaddr/gethostbyname2, and so also will check /etc/hosts/NIS/etc:

getent hosts unix.stackexchange.com | awk '{ print $1 }'

Or, as Heinzi said below, you can use dig with the +short argument (queries DNS servers directly, does not look at /etc/hosts/NSS/etc) :

dig +short unix.stackexchange.com

If dig +short is unavailable, any one of the following should work. All of these query DNS directly and ignore other means of resolution:

host unix.stackexchange.com | awk '/has address/ { print $4 }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 }'

If you want to only print one IP, then add the exit command to awk's workflow.

dig +short unix.stackexchange.com | awk '{ print ; exit }'
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'
host unix.stackexchange.com | awk '/has address/ { print $4 ; exit }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 ; exit }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }'
  • 2
    By default, using dig only works with ipv4, where host gives both ipv4 and ipv6 answers. This might be unexpected. You can try host www.google.com, dig +short www.google.com, host ipv6.google.com, dig +short ipv6.google.com, host www.facebook.com, dig +short www.facebook.com. – jfg956 Sep 21 '11 at 15:21
  • 7
    DIG does not work, if is a CNAME it will not return the IP. – sorin Mar 14 '14 at 14:23
  • 4
    Sometimes, host can be timed out and returns nothing. For some domains, dig +short may return domain alias in the first line. So, to ensure the output is an IPv4 address, use dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1. – caiguanhao Jun 7 '14 at 15:25
  • 15
    Using getent hosts <host> is incorrect, as for instance it may give an IPv6 address while IPv6 doesn't work. The correct solution is to use getent ahosts <host> to try both IPv6 and IPv4 if needed. – vinc17 Oct 3 '16 at 15:02
  • 7
    Worth mentioning: host, dig and nslookup seems to directly talk to the servers listed in resolv.conf, whereas "getent hosts" respect both the local hosts file and library-level caching (such as nscd) if enabled. – Saustrup Jun 12 '17 at 11:59

With host from the dnsutils package:

$ host unix.stackexchange.com
unix.stackexchange.com has address

(Corrected package name according to the comments. As a note other distributions have host in different packages: Debian/Ubuntu bind9-host, openSUSE bind-utils, Frugalware bind.)

  • 1
    See the resolveip entry below if you need to resolve something not in DNS (e.g. /etc/hosts) – Gavin Brock Jul 2 '12 at 8:56
  • 2
    Be aware that host sometimes returns multi-line output (in the case of redirects), you'll want host unix.stackexchange.com | tail -n1 if you just want the line with the IP address. – Edward Coffey Jan 23 '13 at 5:04
  • There are multiple versions of "host" with different output formats. E.g. most systems seem to have the BIND9 version, but my Ubuntu 10.04 LTS server has some completely different version somehow.. – ColinM May 22 '14 at 19:51
  • if you don't have host or dig installed you can use ping instead which is always available: ping unix.stackexchange.com -c 1 -q 2>&1 | grep -Po "(\d{1,3}\.){3}\d{1,3}" this does not need any extra packages install on most Unix/Linux matchines. – Boynux May 23 '14 at 8:18
  • 4
    This answer deserves a serious downvote. host is a DNS tool (similar to nslookup) so it only looks up hosts in DNS, not in e.g. /etc/hosts. So it is NOT an answer to OP's question. – peterh Sep 11 '14 at 9:49

I have a tool on my machine that seems to do the job. The man page shows it seems to come with mysql... Here is how you could use it:

resolveip -s unix.stackexchange.com

The return value of this tool is different from 0 if the hostname cannot be resolved :

resolveip -s unix.stackexchange.coma
resolveip: Unable to find hostid for 'unix.stackexchange.coma': host not found
exit 2

UPDATE On fedora, it comes with mysql-server :

yum provides "*/resolveip"
mysql-server-5.5.10-2.fc15.x86_64 : The MySQL server and related files
Dépôt         : fedora
Correspondance depuis :
Nom de fichier      : /usr/bin/resolveip

I guess it would create a strange dependency for your script...

  • 7
    This seems to be the only solution on here that uses the OS's build in resolver - so works for /etc/hosts as well as DNS. – Gavin Brock Jul 2 '12 at 8:57
  • 8
    getent, as detailed in the other answer, also looks at /etc/hosts, and comes with glibc, so has no dependencies on a Linux system. – Asfand Qazi Apr 16 '16 at 13:32
  • I would not use resolveip since you create a dependency on another package. getent is installed by default. host, nslookup, and dig are all in optional packages. Definitely use getent in a script. – Michael Grant Apr 21 '20 at 17:07
  • i like this answer but it doesn't return ipv6 – MaXi32 Jul 11 '20 at 8:36

The following command using dig allows you to read the result directly without any sed/awk/etc. magic:

$ dig +short unix.stackexchange.com

dig is also included in the dnsutils package.

Note: dig has a return value of 0, even if the name could not be resolved. Thus, you'd need to check if the output is empty instead of checking the return value:


ip=`dig +short $hostname`

if [ -n "$ip" ]; then
    echo IP: $ip
    echo Could not resolve hostname.

Note 2: If a hostname has multiple IP addresses (try debian.org, for example), all of them will be returned. This "problem" affects all of the tools mentioned in this question so far:

  • 3
    Note that if a domain has a CNAME entry its domain may be printed in the first line instead of an IP address. – pcworld Apr 27 '18 at 23:27
getent hosts unix.stackexchange.com | cut -d' ' -f1
  • 4
    Also consider ahosts, ahostsv4, ahostsv6 with getent. – 0xC0000022L Apr 29 '15 at 22:12
  • cut will not for getent's, which use \t to separate columns. This is the case on Solaris. – ceving Mar 18 '16 at 9:51
  • 1
    @ceving: On Solaris you might have to run cut without -d (defaults to \t as delimiter ). On Linux it's spaces, thus the line above works. – sborsky Apr 7 '16 at 22:24

The solutions given so far mostly work in the simpler case: the hostname directly resolves to a single IPv4 address. This might be the only case where you need to resolve hostnames, but if not, below is a discussion on some cases that you might need to handle.

Chris Down and Heinzi briefly discussed the case where the hostname resolves to more than one IP addresses. In this case (and others below), basic scripting under the assumption that a hostname directly resolves to a single IP address may break. Below, an example with a hostname resolving to more than a single IP address:

$ host www.l.google.com
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address

But what is www.l.google.com? This is where the alias case needs to be introduced. Let's check the example below:

$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address

So www.google.com does not directly resolve to IP addresses, but to an alias that itself resolves to multiple IP addresses. For more information on aliases, check here. Of course, the case where an alias has a single IP address is possible, as shown below:

$ host g.www.ms.akadns.net
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address

But can aliases be chained? The answer is yes:

$ host www.microsoft.com
www.microsoft.com is an alias for toggle.www.ms.akadns.net.
toggle.www.ms.akadns.net is an alias for g.www.ms.akadns.net.
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address

$ host www.google.fr
www.google.fr is an alias for www.google.com.
www.google.com is an alias for www.l.google.com.
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address
www.l.google.com has address

I did not find any example where a hostname resolves to an alias that does not resolve to an IP address, but I think the case might occur.

More than multiple IP addresses and aliases, is there some other special cases... what about IPv6? You could try:

$ host ipv6.google.com
ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2a00:1450:8007::68

Where the hostname ipv6.google.com is an IPv6-only hostname. What about dual-stack hostnames:

$ host www.facebook.com
www.facebook.com has address
www.facebook.com has IPv6 address 2620:0:1c08:4000:face:b00c::

Again about IPv6, if your host is IPv4 only, you can still resolve IPv6 addresses (tested on a IPv4 only WinXP and with ipv6.google.com, you could try it on Linux). In this case, the resolution succeeds, but a ping fails with an unknown host error message. This might be a case where your scripting fails.

I hope those remarks were useful.

  • 2
    What a great complement to the accepted answer, showing all the edge cases that one might want to deal with in scripting. My version host does not even state "has address" for my boxes. – Mihai Danila Feb 15 '13 at 23:23

To avoid the problem with aliases and always get a single IP address ready for use:

python -c 'import socket; print socket.gethostbyname("www.example.com")'
ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

works without dependencies on other systems (and for hosts specified in /etc/hosts)

  • 2
    The use of ping is what I needed as I need the value from the hosts file but the sed pattern parsing correctly but this worked ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/^[^(]*[(]//" | sed -e "s/[)].*$//" – ManiacZX Jan 18 '13 at 19:23
  • 1
    To resolve something on my home network like myhostname.local this works so for me this is the best answer. – Matt Friedman Jan 24 '15 at 2:59
  • 1
    May I suggest this also: ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1 – Matt Friedman Jan 24 '15 at 3:08
  • getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname> works for declarations inside /etc/hosts, too ... and it's the go-to-tool for all kinds of system databases (passwd, group, aliases, services). – 0xC0000022L Apr 30 '15 at 7:53

Simple but useful:

  1. getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  2. getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  3. getent hosts google.de | head -n 1 | cut -d ' ' -f 1

All commands will resolve an IP address if the host still exists. If the host points to a CNAME it will also get the IP in that case.

The first command returns the resolved IPv4 address.

The second command returns the resolved IPv6 address.

The third command will return the owner's preferred address, which may either an IPv4 or an IPv6 address.

  • By far the most simple one. And its avilable by default. Not like host that require install of the bindutils – michaelbn Oct 21 '15 at 6:45

Here is a slight variation of the ping approach that takes "unknown host" into account (by piping through stderr) and uses tr to avoid the use of sed regexps:

ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

In case it's important to capture the exit value, then the following will work (although less elegant):

ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'
  • I love this solution, because it works without any extra tools. – Radon8472 Aug 9 '18 at 8:14

To complete Chris Down's answer, and address jfgagne comments about (possibly chained) aliases, here is a solution that :

  • takes into account multiple IPs
  • takes into account one or more aliases (CNAME)
  • does not query /etc/hosts file (in my case I didn't want it); to query it, dbernt's python solution is perfect)
  • does not use awk/sed

    dig +short www.alias.com  | grep -v "\.$" | head -n 1

Always returns the first IP address, or empty tring if not resolved. with version of dig :

    $ dig -v
    DiG 9.8.1-P1
  • 1
    Thanks, other answers assume "dig +short" always returns a single ip address. They weren't accounting for CNAMEs. – jamshid May 10 '16 at 0:46
 php -r "echo gethostbyname('unix.stackexchange.com');"
  • this works, but it requires that php is installed on your terminal – Radon8472 Aug 9 '18 at 8:29
  • 1
    can be useful on a typical php docker container where "host", "dig" etc. are not available – Fabian Schmengler Sep 5 '18 at 19:42

I would have liked to add this as a comment to Andrew McGregor Re: ping. However it wouldn't let me, so I need to add this as another answer. (If somebody can move it into a comment, feel free to.)

This is another variant, only using ping and grep:

ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}"

grep -E for extended regular expression and grep -o to return only the matching part. the regexp itself looks for one or multiple digits ([0-9]+) and optionally a dot (\.?) four times ({4})


You could use host:


# strips the IP
IP=$( host ${hostname} | sed -e "s/.*\ //" )

# checks for errors
if [ $? -ne 0 ] ; then
   echo "Error: cannot resolve ${hostname}" 1>&2
   exit 1;

here's a Bash recipe I cooked up using other folk's answers — first tries /etc/hosts, then falls back to nslookup:

    local host="$1"
    if [ -z "$host" ]
        return 1
        local ip=$( getent hosts "$host" | awk '{print $1}' )
        if [ -z "$ip" ] 
            ip=$( dig +short "$host" )
            if [ -z "$ip" ]
                echo "unable to resolve '$host'" >&2 
                return 1
                echo "$ip"
                return 0
            echo "$ip"
            return 0
  • To be clear, getent hosts isn't just a lookup in /etc/hosts - it's a full-on DNS-resolving call to gethostbyaddr(3), and it's very unlikely to fail in a case where dig will succeed. See the man page for getent. – Stuart P. Bentley Aug 3 '14 at 11:42
  • @Stuart is right — i've learned a great deal since writing that and oversimplified a powerful command. getent remains my favorite, although i also like dig +short – RubyTuesdayDONO Aug 3 '14 at 18:26
nmap -sP|grep YOUR_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

was the solution I found without DNS server


Maybe not the most concise, but it seems to be robust and efficient:

# $(get_host_dns_short "google.com")
# Outputs the IPv4 IP Address of a hostname, resolved by DNS. Returns 0 if DNS
# responded successfully; 1 otherwise. Will mask error output.
function get_host_dns_short()
        set -o pipefail

        host -4 -W1 -t A "$1" 2>/dev/null | awk '/has address/ { print $NF; exit }'
    ) && return 0 || return 1

This will output a single IPv4 IP, as well as return 1 in the event of failure, while masking stderr output.

You can use it like this:

GOOGLE_IP="$(get_host_dns_short "google.com")"
if [[ $? -eq 0 ]]; then
    echo "Google's IP is ${GOOGLE_IP}."
    echo "Failed to resolve Google's IP."

Google's IP is

If you want an IPv6 address instead, just replace -4 with -6.


dig +noall +answer +nocomments example.com | awk '{printf "%-36s\t%s\n", $1, $5 }'

  • 1
    Some context in what way that answer improves over the already existing ones would be great. Also, please indent commands by 4 spaces (cf. the markdown syntax). – maxschlepzig Mar 17 '16 at 21:14

dig is too slow, nslookup is much faster

nslookup google.com | grep -Po 'Address:\s*[0-9.]+' | tail -1 | sed -e 's/Address:\s*//g'

1 line resolve a list of hostname

for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk '/^Address: / { print $1 }');  echo $a >> ~/Desktop/ip; done

I am doing this all the time on my Mac which does not have getent. ping seems like a hack. I would like to take /etc/hosts into account as well.

So, I wrote a stupid wrapper for dns.lookup for you who have Node.js installed to provide a CLI:

$ npm install -g lookup-hostname
$ lookup google.com
  • 60% chance of breakage before you get anywhere near a resolve. – dotbit Aug 27 '19 at 11:58
  • @dotbit could you elaborate? I've used this weekly since '17 and never had any issues. – Thomas Jensen Aug 27 '19 at 20:47
  • @Jensen but you're the only one ever, as always. The rest of us usually run into FAIL of one sort or the other, and always. – dotbit Aug 30 '19 at 5:55
  • "as always" What do you mean by that? "The rest of us" Who's that? "run into FAIL" What specific issue are you seeing? I'm curious. – Thomas Jensen Aug 31 '19 at 13:59

I don't know the easiest way for a bash-script but if you want to resolve a hostname and see if the host is up, use ping!

ping -a hostname -c 1

Will ping the host one time and resolve the hostname to IP-address.

$ ping -a www.google.com -c 1
PING www.google.com ( 56(84) bytes of data.
64 bytes from arn09s10-in-f4.1e100.net ( icmp_seq=1 ttl=54 time=1.51 ms
  • using ping is good, because everybody has it, but you need to to filter the IP-Part from the outputs, if you like to use it in a script. – Radon8472 Aug 9 '18 at 8:27

Yes, there are many answers already, but a solution using perl is missing:

perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com

In a bash script it could be used like this:

ipaddr=$(perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com)
echo $ipaddr

Modules used here are core modules, so should be available everywhere without installing with CPAN.

  • perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null is much cleaner. but no one but the two of us are using pörl , everyone else uses Pascal Script of course. – dotbit Aug 27 '19 at 12:02
  • Actually I prefer to see the error messages if anything goes wrong. Can't call method "addr" on an undefined value isn't exactly the best error message, but may give a hint about the problem. – Slaven Rezic Aug 30 '19 at 11:21

systemd-resolve   RT.com -t A  | awk '{ print $4 ; exit }'
systemd-resolve unix.stackexchange.com -t A --legend=no | awk '{ print $4 ; exit }'

resolveip -s      RT.com
dig       +short  RT.com
host              RT.com | awk '/has address/ { print $4 }'
nslookup          RT.com | awk '/^Address: /  { print $2 }'
ping -q -c 1 -t 1 RT.com | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

ruby     -rresolv -e      ' print    Resolv.getaddress "RT.com" '
python2  -c 'import socket; print socket.gethostbyname("RT.com")'
perl     -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' RT.com  2>/dev/null
php      -r "echo gethostbyname( 'RT.com' );"

echo        "   all do work for me - take your pick!  "
  • 1
    The ruby version prints quotes around the IP address --- probably print should be used instead of p. – Slaven Rezic Aug 30 '19 at 11:26
  • thx, @Slaven Rezic and feel free to upvote. then again, here at the bottom the script may be more visible actually... ;-) – dotbit Aug 30 '19 at 17:47
host -t a cisco.com

this command will show ip address ( will reslove domain to IP )


Besides above solution, you can translate multiple host name to ip via below script, the only dependency is "ping" command in core Unix:

getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }

getip 'hostname.number1.net'

getip 'hostname.number2.net'

getip 'hostname.number3.net'

getip 'hostname.number4.net'

getip 'hostname.number5.net'

getip 'hostname.number6.net'

getip 'hostname.number7.net'

getip 'hostname.number8.net'
$ cat /tmp/result.log









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.