30

I have a config.txt file with IP addresses as content like this

10.10.10.1:80
10.10.10.13:8080
10.10.10.11:443
10.10.10.12:80

I want to ping every ip address in that file

#!/bin/bash
file=config.txt

for line in `cat $file`
do
  ##this line is not correct, should strip :port and store to ip var
  ip=$line|cut -d\: -f1
  ping $ip
done

I'm a beginner, sorry for such a question but I couldn't find it out myself.

CodingYourLife
  • 7,172
  • 5
  • 55
  • 69
  • `for line in cat file` will run twice... once with `line=cat` and once with `line=file`. I don't think that's what you wanted. – FatalError Mar 15 '12 at 18:44

2 Answers2

59

The awk solution is what I would use, but if you want to understand your problems with bash, here is a revised version of your script.

#!/bin/bash -vx

##config file with ip addresses like 10.10.10.1:80
file=config.txt

while read line ; do
  ##this line is not correct, should strip :port and store to ip var
  ip=$( echo "$line" |cut -d\: -f1 )
  ping $ip
done < ${file}

You could write your top line as

for line in $(cat $file) ; do ...

(but not recommended).

You needed command substitution $( ... ) to get the value assigned to $ip

reading lines from a file is usually considered more efficient with the while read line ... done < ${file} pattern.

I hope this helps.

shellter
  • 36,525
  • 7
  • 83
  • 90
9

You can avoid the loop and cut etc by using:

awk -F ':' '{system("ping " $1);}' config.txt

However it would be better if you post a snippet of your config.txt

anubhava
  • 761,203
  • 64
  • 569
  • 643