al escribir scripts 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 debería procesar el script.
en este tutorial, discutiremos cómo leer un archivo LÍNEA por línea en Bash.,
leer 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 bucle while. El comando read
procesa el archivo LÍNEA por línea, asignando cada línea a la variable line
. Una vez que todas las líneas son procesadas, el bucle while termina.,
de forma predeterminada, el comando read
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 la opción -r
, y para deshabilitar el recorte, se borra el separador de campos interno (IFS
).
estamos usando 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 echo.
leyendo un archivo LÍNEA por línea ejemplos #
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 gestores de paquetes separados por comas (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
Para leer el archivo línea por línea, ejecute el código siguiente en el terminal:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
El código lee el archivo por línea, asigna a cada línea a una variable, y lo imprime. Básicamente, verá la misma salida que si mostrara el contenido del archivo usando el comando cat
.
¿Qué pasa si desea imprimir solo las distribuciones que utilizan 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 printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
al leer un archivo LÍNEA por línea, también puede pasar más de una variable a la read
comando, que dividirá la línea en campos basados en 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, se establece IFS
a una coma (,
) y pasan dos variables distro
y pm
para el read
comando.,todo desde el principio 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 Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora
métodos alternativos de lectura de archivos #
usando una sustitución de proceso #
La sustitución de proceso 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í #
Documento ., La cadena (cat input_file )
mantiene las nuevas líneas:
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 usando un descriptor de archivo:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
cuando se trabaja con descriptores de archivo , utilice un número entre 4 y 9 para evitar conflictos con los descriptores de archivo internos del shell.
conclusión #
en Bash, podemos leer un archivo LÍNEA por línea usando un bucle while y el comando read
.
Deja una respuesta