Cómo leer un archivo línea a línea en Linux con Bash Script

Cómo leer un archivo línea a línea en Linux con Bash Script

Uno de los errores más comunes en la realización de scripts en Linux surge cuando se desea leer un fichero y extraer las líneas. Se tiende a utilizar el bucle 'for', que da lugar a una evaluación de cada palabra y no de cada línea, que es lo que se busca. En este artículo mostramos un método más efectivo.

¿Cuál es un ejemplo de código incorrecto?

Con el bucle 'for':

for line in $(cat file.txt); do echo "$line" ; done
Esta
Es 
La 
Línea
n°
1
Esta
Es 
La 
Línea
n°
2
Esta
[...]

Como podemos ver, el resultado no es el esperado. La solución consiste en utilizar un bucle 'while' asociado al comando interno 'read'. Sin embargo, también podemos obtener el mismo resultado con un bucle 'for' si modificamos el valor de la variable '$IFS' (Internal Field Separator, separador de campo interno) antes de ejecutar el bucle. Esto es lo que veremos a continuación.

¿Cuál es el método de uso del bucle 'while' en Bash?

El bucle 'while' en Bash es una estructura de control de flujo que permite repetir una serie de comandos mientras se cumpla una determinada condición. Es particularmente útil para recorrer archivos línea por línea. Por ejemplo, si tienes un archivo de texto llamado 'file.txt', puedes usar un bucle 'while' para leer e imprimir cada línea de la siguiente manera:

while read line; do

 echo -e "$line\n";

done < file.txt

Esto imprimirá en la consola cada línea del archivo, como:

Esta es la línea n° 1

Esta es la línea n° 2

...

Además, puedes utilizar el comando 'read' junto con el bucle 'while' para asignar los valores de cada campo de un archivo estructurado a diferentes variables. Ten en cuenta que necesitas establecer la variable 'IFS' (Internal Field Separator) al carácter que estás utilizando como separador de campos (por defecto, es un espacio). Por ejemplo, para leer el archivo '/etc/passwd' y extraer información específica de cada usuario:

#!/bin/bash

while IFS=: read user pass uid gid full home shell

do

echo -e "$full :\n\

 Pseudo : $user\n\

 UID :\t $uid\n\

 GID :\t $gid\n\

 Home :\t $home\n\

 Shell :\t $shell\n\n"

done < /etc/passwd

¿Cuál es el método de uso del bucle 'for' en Bash?

Si bien es cierto que el bucle 'while' es el método más simple, este tiene un gran inconveniente: elimina el formateado de las líneas y especialmente los espacios y tabulaciones. El bucle 'for', asociado a un cambio de IFS, permite conservar la estructura del documento a la salida. La siguiente sintaxis permite lograrlo:

oldIFS=$IFS     # Guarda el valor original del separador de campo

IFS=$'\n'     # Establece el nuevo separador de campo, el carácter de fin de línea

for línea in $(cat archivo)

do

   comando

done

IFS=$old_IFS     # Restablece el separador de campo al valor predeterminado

Aquí, el bucle 'for' recorre cada línea del archivo y ejecuta el 'comando' para cada una de ellas, preservando su estructura original.

Linux