Búsqueda de sitios web

Diferentes formas de leer archivos en un script Bash usando el bucle While


Este artículo trata sobre cómo leer archivos en scripts bash usando un bucle while. Leer un archivo es una operación común en programación. Debe estar familiarizado con los diferentes métodos y saber cuál es más eficiente de utilizar. En bash, una sola tarea se puede lograr de muchas maneras, pero siempre hay una manera óptima de realizar la tarea y debemos seguirla.

Antes de ver cómo leer el contenido de un archivo usando el bucle while, una breve introducción a cómo funciona el bucle while. El bucle while evalúa una condición e itera sobre un conjunto determinado de códigos cuando la condición es verdadera.

while [ CONDITION ]
do
    code block
done

Analicemos la sintaxis del bucle while.

  • El bucle while debe comenzar con una palabra clave while seguida de una condición.
  • Una condición debe estar encerrada entre [ ] o [[ ]]. La condición siempre debe ser verdadera para que se ejecute el bucle.
  • El bloque de código real se colocará entre do y done.
NUMBER=0

while [[ $NUMBER -le 10 ]]
do
    echo " Welcome ${NUMBER} times "
    (( NUMBER++ ))
done

Este es un ejemplo muy simple, donde el bucle se ejecuta hasta que NÚMERO no sea mayor que 10 e imprime la declaración de eco.

Junto con mientras usaremos el comando read para leer el contenido de un archivo línea por línea. A continuación se muestra la sintaxis de cómo se combinan los comandos while y read. Ahora hay diferentes formas de pasar el archivo como entrada y las veremos todas.

SYNTAX
while read VARIABLE
do
    code
done

Tubería en Linux

Normalmente usaremos el comando cat para ver el contenido del archivo desde la terminal. Además, canalizaremos la salida del comando cat a otros comandos como grep, sort, etc.

De manera similar, usaremos el comando cat aquí para leer el contenido del archivo y canalizarlo a un bucle while. Para demostración, estoy usando el archivo /etc/passwd, pero no es recomendable alterar este archivo, así que haga una copia de seguridad de este archivo y juegue con él si así lo desea.

cat /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Analicemos lo que sucederá cuando se envíe el código anterior.

  • cat /etc/passwd leerá el contenido del archivo y lo pasará como entrada a través de la tubería.
  • El comando read lee cada línea pasada como entrada del comando cat y la almacena en la variable LREAD.
  • El comando read leerá el contenido del archivo hasta que se interprete EOL.

También puede usar otros comandos como head, tail y canalizarlo al bucle while.

head -n 5 /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Redirección de entrada en Linux

Podemos redirigir el contenido del archivo al bucle while usando el operador de redirección de entrada (<).

while read LREAD
do
    echo ${LREAD}
done < /etc/passwd | head -n 5

También puede almacenar el nombre del archivo en una variable y pasarlo a través de un operador de redirección.

FILENAME="/etc/passwd"

while read LREAD
do
    echo ${LREAD}
done < ${FILENAME}

También puede pasar nombres de archivos como argumento a su secuencia de comandos.

while read LREAD
do
    echo ${LREAD}
done < $1 | head -n 5

Separador de campo interno

Puede trabajar con diferentes tipos de formatos de archivo (CSV, TXT, JSON) y es posible que desee dividir el contenido del archivo según un delimitador personalizado. En este caso, puede utilizar el “Separador de campos interno (IFS)” para dividir el contenido del archivo y almacenarlo en variables.

Déjame demostrarte cómo funciona. Eche un vistazo al archivo /etc/passwd que tiene dos puntos (:) como delimitador. Ahora puedes dividir cada palabra de una línea y almacenarla en una variable separada.

En el siguiente ejemplo, estoy dividiendo el archivo /etc/passwd con dos puntos como separador y almacenando cada división en diferentes variables.

while IFS=":" read A B C D E F G
do
    echo ${A}
    echo ${B}
    echo ${C}
    echo ${D}
    echo ${E}
    echo ${F}
    echo ${G}
done < /etc/passwd

Mostré solo una línea dividida en la captura de pantalla anterior considerando el tamaño de la captura de pantalla.

Líneas vacías en Linux

Las líneas vacías no se ignoran cuando recorre el contenido del archivo. Para demostrar esto, he creado un archivo de muestra con el siguiente contenido. Hay 4 líneas y algunas líneas vacías, espacios en blanco al principio, espacios en blanco al final, caracteres de tabulación en la línea 2 y algunos caracteres de escape (\n y \t).

while read LREAD
do
    echo ${LREAD}
done < testfile

Vea el resultado, la línea en blanco no se ignora. Además, algo interesante a tener en cuenta es cómo el comando leer recorta los espacios en blanco. Una forma sencilla de ignorar las líneas en blanco al leer el contenido del archivo es utilizar el operador de prueba con el indicador -z que comprueba si la longitud de la cadena es cero. Ahora repitamos el mismo ejemplo pero esta vez con un operador de prueba.

while read LREAD
do
    if [[ ! -z $LREAD ]]
    then
        echo ${LREAD} 
    fi
done < testfile

Ahora, en el resultado, puede ver que se ignoran las líneas vacías.

Personajes de escape

Los caracteres de escape como \n, \t, \c no se imprimirán al leer un archivo. Para demostrar esto, estoy usando el mismo archivo de muestra que tiene pocos caracteres de escape.

while read LREAD
do
    echo ${LREAD}
done < testfile

Puede ver en el resultado que los caracteres de escape han perdido su significado y solo se imprimen n y t en lugar de \n y \t. . Puede utilizar -r para evitar la interpretación de la barra invertida.

while read -r LREAD
do
    echo ${LREAD}
done < testfile

Eso es todo por este artículo. Nos encantaría recibir noticias suyas si tiene algún comentario o sugerencia. Tus comentarios son los que nos ayudan a crear mejor contenido. Sigue leyendo y sigue apoyando.