jueves, 29 de marzo de 2012

Leer un archivo de texto línea por línea desde el Terminal de Linux






Me surgió el otro día la necesidad de leer el contenido de un archivo de texto desde el terminal de Linux. Quería que un comando linux tomara como argumentos o parámetros de entrada el contenido de ese archivo, de tal forma que cada argumento correspondería a una línea de ese archivo.

Para probar el script que veremos posteriormente tenemos que crear el archivo de texto a leer, que llamaremos lista.txt y que tendría el siguiente contenido:


Madrid
Barcelona
Valencia
Bilbao

Lo siguiente sería crear un script, el cual leyera línea por línea el archivo de texto. Para cada línea aplicara el comando deseado. Sería algo así:

#! / bin / bash        
FILENAME=nombre_archivo 
while read line        
do        
    COMANDO $line
done < $FILENAME



En mi caso, como es solo un ejemplo, he escogido el comando "echo", que mostrará los valores por pantalla, así que correspondería al siguiente código:


#! / bin / bash        
 
FILENAME=lista.txt
while read line        
do        
    echo $line
done < $FILENAME


Al ejecutarlo, se mostraría en el terminal el siguiente texto:

Madrid Barcelona Valencia Bilbao

Con ésto ya habríamos conseguido nuestro propósito.

Este script puede servirnos como base para crear otros más complejos, o para pasar muchos argumentos a un comando sin tener que escribirlos directamente en el terminal.




19 Comentarios:

Anónimo dijo...

hola, que bueno tu post!!!, ahora mi duda es como hago para pasarle el archivo a leer al control while?? no logo que me ande...saludos!!!

Felipe Martínez D. dijo...

Hola.

Efectivamente al redactar el post no escribí correctamente el script. Ahora ya está corregido y probado.

Muchas gracias por comentar.

Anónimo dijo...

Felipe, es excelente porque lo hiciste simple.

Como se podría hacer para leer desde dos archivos a la vez?
Por ejemplo en uno tendría un listado de ip´s y en el otro comandos a ejecutar.

Gracias!

Felipe Martínez D. dijo...

Hola,

El siguiente comando te puede valer (asumiendo que los dos archivos tienen el mismo número de líneas):

awk '{print;getline < "file1";print $0}' file2

Fuente:
http://www.unix.com/shell-programming-scripting/103827-need-shell-script-read-two-file-same-time-print-out-single-file.html

Saludos.

Anónimo dijo...

muy bueno y agradecería como copio a otro txt determinadas lineas con una condicion. G
Gracias

Felipe Martínez D. dijo...

Hola.

No lo he probado, pero creo que lo que buscas se haría así:



FILENAME=$1
cat $FILENAME | while read LINE
do
if [ "$LINE" = "hola" ]
then
echo "$LINE" >> otro_archivo.txt
fi
done


Pruébalo y si no te funciona coméntamelo e intentaré ayudarte.

Saludos.

Anónimo dijo...

cómo puedo en lugar que imprima las cadenas que imprima números empezando del 1 osea
1
2
3
4

Felipe Martínez D. dijo...

Hola.

Esta aplicación simplemente muestra lo que contiene un archivo de texto. Puedes crearte un archivo con los números, si eso es lo que deseas mostrar.

Saludos

Unknown dijo...

Hola......
y como podria leer desde una linea del archivo, una posicion especifica...
A;B;C;D;E;F;G;
I;J;K:L;M;N;O;
como podria obtener A, I
siendo siempre la primera columna la que quiero obtener????

Felipe Martínez D. dijo...

Hola.

Para hacer ésto debes de utilizar el comando awk, de la siguiente manera:

awk -F';' '{ print $1 }' nombrearchivo


Para más información puedes leer un post que hice:
http://felinfo.blogspot.com.es/2012/10/uso-basico-del-comando-awk-linux.html

Unknown dijo...

se puede recorrer dos archivos de esa manera?

Felipe Martínez D. dijo...

Hola Daniel.

Claro, puedes crearte un script que recorra dos archivos. Únicamente debes de cambiar el FILENAME, que corresponde al nombre del archivo.

Saludos.

Matu dijo...

Hola Felipe,

Quisiera desplegar en un dialog el contenido de un archivo para que se despliegue como opción de entrada.

Por ejemplo tengo un archivo que contiene nombres de países y quiero que ejecutando un programa muestre en un dialog todos los países para que el usuario final seleccione uno y de ahí ejecute un script particular. Se entiende¿?

Desde ya muchas gracias

Felipe Martínez D. dijo...

Hola Matu.

Me faltan datos sobre lo que quieres hacer. ¿Se trata de una aplicación, de una web? ¿en qué lenguaje estás trabajando?

Saludos.

Matu dijo...

Perdona, lo que estoy haciendo es en un script bash en linux ;)

Felipe Martínez D. dijo...

Hola Matu.

Aquí se habla sobre cómo hacer un menú con múltiples opciones desde bash script:

http://stackoverflow.com/questions/11279423/bash-getopts-with-multiple-and-mandatory-options

Si tienes alguna duda, dímelo.

Saludos.

Unknown dijo...

Hola tengo un fichero con la siguiente estructura

-P INPUT DROP
-P OUTPUT ACCEPT
-P FORWARD ACEEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -s 127.0.0.0/8 ! -i lo -j DROP

Quisiera leer linea por linea y ejecutar el comando
iptables $linea
para que por cada linea del fichero ejecute iptables y el resto de la linea pero cuando hago eso da error me pudieras ayudar gracias

Felipe Martínez D. dijo...

Hola Lázaro.

Indica qué error te da. ¿Has probado el ejemplo que muestro en este post?.

Saludos.

Anónimo dijo...

hola, tengo un archivo A y un archivo B, y debo actualizar el B en base a un campo que está en ambos. Como lo puedo hacer? con el FILENAME?

Publicar un comentario

Felinfo: Java, Linux, Virtualización. Open Source.  ©Template Blogger Green by Dicas Blogger .

TOPO