Diferentes formas de leer un archivo en un script Bash usando While Loop


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 la programación. Debe estar familiarizado con los diferentes métodos y qué método es más eficaz de utilizar. En bash, una sola tarea se puede lograr de muchas maneras, pero siempre hay una forma óptima de hacer la tarea y debemos seguirla.

Antes de ver cómo leer el contenido de un archivo usando while loop, una introducción rápida sobre cómo funciona while loop. Mientras que el bucle evalúa una condición e itera sobre un conjunto dado de códigos cuando la condición es verdadera.

while [ CONDITION ]
do
    code block
done

Analicemos la sintaxis del ciclo while.

  • El ciclo while debe comenzar con una palabra clave while seguida de una condición.
  • Una condición debe incluirse entre [] o [[]]. La condición siempre debe ser verdadera para que se ejecute el ciclo.
  • 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 ciclo se ejecuta hasta que NUMBER no es mayor que 10 e imprime la declaración de eco.

Junto con while 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 sort, etc.

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

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

Analicemos qué 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.
  • read command lee cada línea pasada como entrada del comando cat y la almacena en la variable LREAD.
  • el comando de lectura 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 a 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 archivo 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 en función de un delimitador personalizado. En este caso, puede utilizar el "Separador de campo 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 puede 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.

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 contenido a continuación. Hay 4 líneas y pocas líneas vacías, espacios en blanco iniciales, espacios en blanco finales, tabulaciones 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 de lectura 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 la salida, puede ver que las líneas vacías se ignoran.

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 la salida que los caracteres de escape han perdido su significado y solo n y t se imprimen en lugar de \n y \t . Puede usar -r para evitar la interpretación de barra invertida.

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

Eso es todo por este artículo. Nos encantaría saber de usted si tiene algún comentario o sugerencia. Sus comentarios son lo que nos ayuda a crear un mejor contenido. Sigue leyendo y sigue apoyando.