Justin
Justin

Reputation: 45350

Bash script to get all IP addresses

I am trying to write a bash script to get all IP addresses on a server. The script should work on all major distros. Here is what I have:

ifconfig | grep 'inet addr:' | awk {'print $2'}

Resulting in:

addr:10.1.2.3
addr:50.1.2.3
addr:127.0.0.1

How can I first remove the addr: prefix? Second, how I can exclude 127.0.0.1?

Upvotes: 12

Views: 34658

Answers (11)

David Okwii
David Okwii

Reputation: 7840

I would to introduce you to a command-line tool called OSQuery by Facebook which helps you get system info by making SQL-like queries. For your case for instance, you would have enter;

osquery> select * from interface_addresses; 

Which would output something like;

interface = wlan0
       address = 192.168.0.101
          mask = 255.255.255.0
     broadcast = 192.168.0.255
point_to_point = 

Which I find a lot more neat and convenient.

Upvotes: 0

Matt Clark
Matt Clark

Reputation: 28599

Simply using hostname you can get a list of all your IP addresses, using the -I flag.

i.e.

$ hostname --all-ip-addresses || hostname -I
10.10.85.100 10.20.85.100 10.30.85.100

whereas

$ hostname --ip-address || hostname -i
::1%1 127.0.0.1

Centos7 (k3.10.0)

Upvotes: 8

Gerard ONeill
Gerard ONeill

Reputation: 4102

I'm always surprised to see people using sed and awk instead of perl.

But first, using both grep and awk with an extra option, feel free to just:

ifconfig | grep 'inet addr:' | awk {'print $2'} | awk -F: {'print $2'} | grep -v '127.0.0.1'

replacing the awks with perl:

ifconfig | grep 'inet addr:' | perl -F\\s\|: -ane 'print "$F[2]\n"' | grep -v '127.0.0.1'

replacing the greps within the same perl script:

ifconfig | perl -F\\s\|: -ane 'next if !/^inet addr:/ or /127\.0\.0\.1/; print "$F[2]\n"'

and lastly just using the power of perl's regex:

ifconfig | perl -ne 'next if !/inet addr:(?<ip>[0-9.]+)/ or $+{ip} == "127.0.0.1"; print "$+{ip}\n"'

Upvotes: -1

if it is only the "addr:" word that you'd like to remove I would use sed instead of awk like

ifconfig | grep 'inet addr:' | awk {'print $2'}| grep -v 127.0.0.1 | sed -e 's/addr://'

Upvotes: -1

Asclepius
Asclepius

Reputation: 63312

This is merely a distillation of several prior answers and comments. Sample output is included.

To list IPs:

Using ip:

(Restricted to IPv4 and global)

$ /sbin/ip -4 -o addr show scope global | awk '{gsub(/\/.*/,"",$4); print $4}'
192.168.82.134
138.225.11.92
138.225.11.2

Using ifconfig:

(Excluding 127.0.0.1)

$ /sbin/ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }'
192.168.82.134
138.225.11.92
138.225.11.2

To map IPs to hostnames, see this answer.

Upvotes: 2

Steve
Steve

Reputation: 54392

There's no need for grep. Here's one way using awk:

List only addr:

ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }'

List device and addr:

ifconfig | awk -v RS="\n\n" '{ for (i=1; i<=NF; i++) if ($i == "inet" && $(i+1) ~ /^addr:/) address = substr($(i+1), 6); if (address != "127.0.0.1") printf "%s\t%s\n", $1, address }'

Upvotes: 8

dschinn1001
dschinn1001

Reputation: 133

Here is a similiar script for what I have tested to get an ip-range of addresses, but it is slowly - somebody might give a hint, how to accelerate this ? (the ip-range here is an example for to get all lines, who seems to be up - between Vancouver and Korea) :

#!/bin/bash

for ip in {209..210}.{125..206}.{5..231}.{65..72} # any ip between 209.126.230.71 and 210.205.6.66

do

printf ' === %s ===\n' "$ip"

whois "$ip" >> /home/$user/test001.txt

done

If this is too trivial or some mistake in it here, simply answer or comment.

This script would last until finish about 5 to 8 hours.

Upvotes: 1

Pedro Lacerda
Pedro Lacerda

Reputation: 1138

ifconfig was obsoleted by ip. It also has the flag -o that write outputs easy to parse. Use ip -4 to show only IPV4 addresses. Note the simpler script, it already exclude the loopback address:

ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {print $2" "$4}'

Or if you don't want the networks:

ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {gsub("/", " "); print $2" "$4}'

Upvotes: 18

Marcus
Marcus

Reputation: 6839

ifconfig | grep 'inet addr:' | awk {'print $2'} | awk 'BEGIN{FS=":"}{print $2}' | grep -v '127.0.0.1'

Upvotes: -1

John3136
John3136

Reputation: 29265

Use grep -v to ignore 127.0.0.1

ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1'

Use sed to edit out the 'addr:'

ifconfig | grep 'inet addr:' | awk {'print $2'}  | grep -v '127.0.0.1' | sed -e 's/addr://'

Upvotes: -1

timoph
timoph

Reputation: 1

ifconfig | grep 'inet addr:' | awk {'print $2'} | cut -d ":" -f 2

Upvotes: -2

Related Questions