I have a Linux server and I want to find the main IPv6 address via one single command line.

My command so far:

$ ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'

which shows:


But I want only one occurrence, so that the output reads:

  • write a shell script and put those commands in there: voila, you have now created a "single" command. – akira Aug 31 '12 at 17:13
  • 4
    When dealing with IPv6 it is not really recommended to limit to a single addresses. There can be multiple global addresses, multiple link-local addresses, multiple site-local addresses... – grawity Aug 31 '12 at 17:25
ip -6 addr

will show your IPv6 addresses.

  • % ip -6 addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 inet6 ::1/128 scope host valid_lft forever preferred_lft forever ... still greppable – akira Aug 31 '12 at 17:13
  • This does not solve the stated question. OP wants a single command line to retrieve one IPv6 (which probably means the primary public one). So either ip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p' or ip -6 addr show dev eth0 | awk '/inet6/{print $2}' could be used as a base and OP can extend/edit them for his specific use case. – rwenz3l Oct 30 '18 at 21:04

/sbin/ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^::1 | grep -v ^fe80

The output of /sbin/ip -6 addr | grep inet6 looks something like this:

inet6 ::1/128 scope host 
inet6 2001:123:456:55f::1/64 scope global 
inet6 fe80::62eb:69ff:fed2:d2a6/64 scope link 

awk -F '[ \t]+|/' '{print $3}' splits each line setting delimiters to be either one or more white spaces or a forward slash. The part we need is the $3.

grep -v ^::1 | grep -v ^fe80 to exclude any line starting with ::1 or fe80.

  • there is way too much piping of grep into awk, this could be collaspe into a single awk ` awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next ; } /inet6/ {print $3} '` – Archemar Mar 26 '16 at 9:02
$ /sbin/ifconfig | grep inet6
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link
      inet6 addr: fe80::211:22ff:fe33:4455/64 Scope:Link
      inet6 addr: ::1/128 Scope:Host

If you want a random selection of one IPv6 address

$ /sbin/ifconfig | grep inet6 | head -n 1
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link

If you want the IPv6 address of the most common name for the first Ethernet adapter

$ /sbin/ifconfig eth0 | grep inet6
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link

If you just want the address

$ /sbin/ifconfig eth0 |  awk '/inet6/{print $3}'

Use the following command to view your IP address on Linux :


Normally, Ipv6 address looks like 2001:5c0:9168::/48 . If you are facing any conflict in your IP, follow the below steps to set an IP address again:

  1. To assign IPv6 IPs, make sure you have the iproute2 tools installed.
  2. Using them, let's start to assign your IPs.
  3. Make sure that the ipv6 module installed or not.

Then, use the following command to add new ip:

ip -f inet6 addr add 2001:5c0:9168::2/64 dev eth0

Afterwards, add default ip via

ip -f inet6 ro add default via 2001:5c0:9168::1 dev eth0

After completing your installation, just reconfigure/restart your IPv6 enabled services, like Apache, SSH etc.

  • ifconfig is obsolete on Linux and should no longer be used. Modern Linux distros don't even install it by default anymore (unless some ancient package requires it). – Michael Hampton Oct 30 '18 at 22:47

With a few small tweaks, your original attempt would've worked:

ip -o -6 addr show eth0 | sed -e 's/^.*inet6 \([^ ]\+\).*/\1/'

The big change there is the addition of the -o flag to causes the entries to be printed out, one per line, which make it easier to run sed over them.


First, you need to remember that with IPv6 any machine may have several IPv6 addresses, and they may be on separate networks, and any of them might be used, depending on where you want to reach.

So, before you can answer the question of what is your source IP address you have to decide where you're sending the traffic. Then you can just ask Linux to tell you which IPv6 address will be the source when you send traffic to that destination.

If you're sending it to "the Internet" then just pick a global IPv6 address at random, e.g. Google's Public DNS address.

ip r get to 2001:4860:4860::8888 | perl -ne '/src ([\w:]+)/ && print "$1\n"'

This asks Linux for the route to that destination. Perl parses the result looking for src and then prints the next field.

By providing a different destination, you may receive a different source address:

ip r get to ::1 | perl -ne '/src ([\w:]+)/ && print "$1\n"'

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.