Al escribir scripts de Bash, a veces se encontrará en situaciones en las que necesita leer un archivo línea por línea. Por ejemplo, puede tener un archivo de texto que contenga datos que el script debería procesar.
En este tutorial, discutiremos cómo leer un archivo línea por línea en Bash.
Leyendo un archivo sintaxis línea por línea #
La sintaxis más general para leer un archivo línea por línea es la siguiente:
while IFS= read -r line; do
printf '%s\n' "$line"
done < input_file
o la versión equivalente de una sola línea:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
¿Cómo funciona?
El archivo de entrada (input_file
) es el nombre del archivo redirigido al ciclo while. El read
El comando procesa el archivo línea por línea, asignando cada línea a la line
variable. Una vez que se procesan todas las líneas, el bucle while termina.
De forma predeterminada, read
El comando interpreta la barra invertida como un carácter de escape y elimina todos los espacios en blanco iniciales y finales, lo que a veces puede causar un comportamiento inesperado. Para deshabilitar el escape de barra invertida, estamos invocando el comando con -r
opción, y para deshabilitar el recorte, el separador de campo interno (IFS
) se borra.
Estamos usando [printf
] en lugar de echo
para hacer el código más portátil y evitar comportamientos no deseados. Por ejemplo, si la línea contiene valores como "-e", se tratará como una opción de eco.
Ejemplos de lectura de un archivo línea por línea #
Echemos un vistazo al siguiente ejemplo. Supongamos que tenemos un archivo llamado distros.txt
que contiene una lista de algunas de las distribuciones de Linux más populares y sus administradores de paquetes separados por comas (,
):
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf
Para leer el archivo línea por línea, debe ejecutar el siguiente código en su terminal:
while IFS= read -r line; do
printf '%s\n' "$line"
done < distros.txt
El código lee el archivo por línea, asigna cada línea a una variable y lo imprime. Básicamente, vería el mismo resultado que si mostrara el contenido del archivo usando el cat
comando.
¿Qué sucede si desea imprimir solo las distribuciones que usan apt? Una forma sería usar el if
instrucción y verifique si la línea contiene la subcadena apt:
while IFS= read -r line; do
if [[ "$line" == *"apt"* ]]; then
printf '%s\n' "$line"
fi
done < distros.txt
Ubuntu,apt
Debian,apt
Al leer un archivo línea por línea, también puede pasar más de una variable a read
comando, que dividirá la línea en campos según IFS
. El primer campo se asigna a la primera variable, el segundo a la segunda variable y así sucesivamente. Si hay más campos que variables, los campos sobrantes se asignan a la última variable.
En el siguiente ejemplo, configuramos IFS
a una coma (,
) y pasar dos variables distro
y pm
al read
dominio. Todo, desde el comienzo de la línea hasta la primera coma, se asignará a la primera variable (distro
), y el resto de la línea se asignará a la segunda variable (pm
):
while IFS=, read -r distro pm; do
printf '%s is the package manager for %s\n' "$pm" "$distro"
done < distros.txt
apt is the package manager for Ubuntu
apt is the package manager for Debian
yum is the package manager for CentOS
pacman is the package manager for Arch Linux
dnf is the package manager for Fedora
Métodos alternativos de lectura de archivos #
Usando una Sustitución de Proceso #
La sustitución de procesos es una característica que le permite usar la salida del comando como un archivo:
while IFS= read -r line; do
printf '%s\n' "$line"
done < <(cat input_file )
Usando una cadena aquí #
Here String es una variante del documento Here. La cadena (cat input_file )
mantiene las líneas nuevas:
while IFS= read -r line; do
printf '%s\n' "$line"
done <<< $(cat input_file )
Usando el descriptor de archivo #
También puede proporcionar la entrada al bucle utilizando un descriptor de archivo:
while IFS= read -r -u9 line; do
printf '%s\n' "$line"
done 9< input_file
Cuando trabaje con descriptores de archivos, use un número entre 4 y 9 para evitar conflictos con los descriptores de archivos internos del shell.
Conclusión #
En Bash, podemos leer un archivo línea por línea usando un ciclo while y el read
comando.
Si tiene alguna pregunta o comentario, no dude en dejar un comentario.