GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo leer un archivo línea por línea en Bash

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 (, ):

distros.txt
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.


Linux
  1. ¿Cómo leer una variable de un archivo?

  2. En Bash, ¿cómo agrego una cadena después de cada línea en un archivo?

  3. ¿Cómo analizar un archivo CSV en Bash?

  4. Leer línea por línea en bash script

  5. ¿Cómo verificar syslog en Bash en Linux?

Cómo comentar en Bash

Cómo usar el comando de lectura Bash

Cómo leer archivos línea por línea en Bash

Cómo verificar si existe un archivo o directorio en Bash

Cómo redirigir stderr a stdout en Bash

Bash scripting:cómo leer datos de archivos de texto