2012-03-15 12 views
13

Tengo un archivo config.txt con direcciones IP como contenido como estofiesta utilización guión cortar comando en variable y almacenar el resultado en otra variable

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

Quiero de ping todas las direcciones IP en ese archivo

#!/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 

Soy un principiante, lo siento por esa pregunta, pero no pude encontrarlo por mi cuenta.

+0

'for line in cat file' se ejecutará dos veces ... una vez con' line = cat' y una vez con 'line = file'. No creo que eso es lo que querías. – FatalError

Respuesta

30

La solución awk es lo que yo usaría, pero si quieres entender tus problemas con bash, aquí hay una versión revisada de tu script.

##config file with ip addresses like 10.10.10.1:80 
#!/bin/bash -vx 
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} 

Usted puede escribir su línea superior como

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

Necesitabas comando de sustitución $(...) para obtener el valor asignado a $ ip

líneas de lectura de un archivo por lo general se considera más eficiente con la while read line ... done < ${file} patrón.

Espero que esto ayude.

+0

+1 no más eficiente, pero más seguro: 'para la línea en $ (

+0

@yourmother, tenga en cuenta el uso de comillas alrededor de las variables aquí: vital para proteger los espacios en blanco en los valores. –

+2

Tenga en cuenta que la ip se puede extraer con 'ip = $ {línea %%: *}' sin tener que llamar a echo | cut. –

4

Usted puede evitar el bucle y cortar etc mediante el uso de:

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

Sin embargo, sería mejor si usted publica un fragmento de su config.txt

Cuestiones relacionadas