Androide

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

¿Cómo leer un fichero línea a línea desde BASH?

¿Cómo leer un fichero línea a línea desde BASH?

Tabla de contenido:

Anonim

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 contiene datos que el script debe procesar.

En este tutorial, discutiremos cómo leer un archivo línea por línea en Bash.

Lectura de un archivo Línea por línea Sintaxis

La sintaxis más general para leer un archivo línea por línea es la siguiente:

while IFS= read -r line do echo "$line" done < input_file

o la versión equivalente de una sola línea:

while IFS= read -r line; do echo $line; done < input_file

¿Como funciona?

El archivo de entrada ( input_file ) es el nombre del archivo que desea abrir para lectura mediante el comando de read . El comando de read lee el archivo línea por línea, asignando cada línea a la variable de line . Una vez que se procesen todas las líneas, el ciclo while terminará. El separador de campo interno ( IFS ) se establece en la cadena nula para preservar los espacios en blanco iniciales y finales, que es el comportamiento predeterminado del comando de read .

Leer un archivo Ejemplos línea por línea

Echemos un vistazo al siguiente ejemplo. Supongamos que tenemos un archivo llamado distros.txt 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 echo "$line" done < distros.txt

El código leerá el archivo por línea, asignará cada línea a una variable y hará eco de la variable. Básicamente, vería el mismo resultado que si mostrara el contenido del archivo con el comando cat.

¿Qué sucede si desea imprimir solo las distribuciones que usan apt? Una forma sería usar la instrucción if y verificar si la línea contiene la subcadena apt:

while IFS= read -r line do if]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

Al leer el archivo línea por línea, también puede pasar más de una variable al comando de lectura que dividirá la línea en campos basados ​​en el IFS . El primer campo se asigna a la primera variable, la segunda a la segunda variable, y así sucesivamente. Si hay más campos que variables, los campos restantes se asignan a la última variable.

En el siguiente ejemplo, estamos configurando IFS en una coma ( , ) y pasando dos variables distro y pm al comando de lectura. 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 echo "$pm" is the package manager for "$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 le permite pasar la salida del comando como un nombre de archivo:

while IFS= read -r line do echo "$line" done < <(cat input_file)

Usando una cadena Here

Here String es una variante del documento Here. La cadena (cat input_file) mantendrá las nuevas líneas:

while IFS= read -r line do echo "$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 echo "$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 al proporcionar el nombre de archivo como entrada para un ciclo de lectura while.

terminal de bash