user1687717
user1687717

Reputation: 3475

how to ping each ip in a file?

I have a file named "ips" containing all ips I need to ping. In order to ping those IPs, I use the following code:

cat ips|xargs ping -c 2

but the console show me the usage of ping, I don't know how to do it correctly. I'm using Mac os

Upvotes: 8

Views: 14794

Answers (7)

Dmitry Shevkoplyas
Dmitry Shevkoplyas

Reputation: 6341

As suggested by @Lupus you can use "fping", but the output is not human friendly - it will scroll out of your screen in few seconds laving you with no trace as of what is going on. To address this I've just released ping-xray. I tried to make it as visual as possible under ascii terminal plus it creates CSV logs with exact millisecond resolution for all targets.

https://dimon.ca/ping-xray/ enter image description here

Hope you'll find it helpful.

Upvotes: 0

Ole Tange
Ole Tange

Reputation: 33685

With GNU Parallel you would do:

parallel -j0 ping -c 2 {} :::: ips

This will run as many jobs in parallel as you have ips or processes.

It also makes sure the output from different jobs are not mixed together, so if you use the output you are guaranteed that you will not get half-a-line from two different jobs.

GNU Parallel is a general parallelizer and makes is easy to run jobs in parallel on the same machine or on multiple machines you have ssh access to.

If you have 32 different jobs you want to run on 4 CPUs, a straight forward way to parallelize is to run 8 jobs on each CPU:

Simple scheduling

GNU Parallel instead spawns a new process when one finishes - keeping the CPUs active and thus saving time:

GNU Parallel scheduling

Installation

If GNU Parallel is not packaged for your distribution, you can do a personal installation, which does not require root access. It can be done in 10 seconds by doing this:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

For other installation options see http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Learn more

See more examples: http://www.gnu.org/software/parallel/man.html

Watch the intro videos: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Walk through the tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Sign up for the email list to get support: https://lists.gnu.org/mailman/listinfo/parallel

Upvotes: 1

Lupus
Lupus

Reputation: 816

You could use fping. It also does that in parallel and has script friendly output.

    $ cat ips | xargs fping -q -C 3
    10.xx.xx.xx   : 201.39 203.62 200.77
    10.xx.xx.xx  : 288.10 287.25 288.02
    10.xx.xx.xx   : 187.62 187.86 188.69
    ...

Upvotes: 1

Chris Seymour
Chris Seymour

Reputation: 85785

You need to use the option -n1 with xargs to pass one IP at time as ping doesn't support multiple IPs:

$ cat ips | xargs -n1 ping -c 2

Demo:

$ cat ips
127.0.0.1
google.com
bbc.co.uk

$ cat ips | xargs echo ping -c 2
ping -c 2 127.0.0.1 google.com bbc.co.uk

$ cat ips | xargs -n1 echo ping -c 2
ping -c 2 127.0.0.1
ping -c 2 google.com
ping -c 2 bbc.co.uk

# Drop the UUOC and redirect the input
$ xargs -n1 echo ping -c 2 < ips
ping -c 2 127.0.0.1
ping -c 2 google.com
ping -c 2 bbc.co.uk

Upvotes: 18

Alessandro Pezzato
Alessandro Pezzato

Reputation: 8802

With ip or hostname in each line of ips file:

( while read ip; do ping -c 2 $ip; done ) < ips

You can also change timeout, with -W flag, so if some hosts isn'up, it wont lock your script for too much time. Also -q for quiet output is useful in this case.

( while read ip; do ping -c1 -W1 -q $ip; done ) < ips

Upvotes: 2

Gilles Qu&#233;not
Gilles Qu&#233;not

Reputation: 185106

Try doing this :

cat ips | xargs -i% ping -c 2 %

Upvotes: 0

Kyle Burton
Kyle Burton

Reputation: 27528

If the file is 1 ip per line (and it's not overly large), you can do it with a for loop:

for ip in $(cat ips); do
  ping -c 2 $ip;
done

Upvotes: 1

Related Questions