Leer ficheros en Bash

A menudo necesitamos leer ficheros en medio de nuestros scripts Bash, para procesar su contenido. Muchas veces nos basta con usar las comillas francesas y el comando cat dentro de un bucle, algo similar a:

for VBLE in `cat FICHERO`
do
# Hacer algo con $VBLE
done
El problema aparece cuando el fichero es muy grande, y el contenido supera el buffer que Bash destina a la línea de argumentos de los comandos (espacio reservado para el argv de la función Main en C, por simplificar mucho). Otras veces tropezamos con esta limitación al usar comodines en los comandos como ls, chmod, rm, etc, dentro de directorios que tienen muuchos archivos, a lo que el intérprete de comandos nos responde con un mensaje que nos viene a decir que la línea de argumentos es demasiado larga :P. En estos casos podemos salir con el uso del comando find y el argumento -exec, pero cuando trabajamos con el contenido de ficheros, esta solución no nos sirve :(.
Por suerte el intérprete Bash contempla esta posibilidad y nos proporciona de comandos específicos para poder procesar archivos de forma secuencial, como siempre hemos hecho. El esquema es el siguiente:
# Abrir el fichero para lectura
# El 8 representa el numero de descriptor asociado al fichero
exec 8< FICHERO

# Bucle para leer todo el contenido
# Cada iteración lee una línea del fichero y la deja en VBLE
while read -u 8 VBLE
do
# Hacer algo con $VBLE
done

# Cerrar el fichero
exec 8<&-
Resulta muy útil.

La foto la he sacado del album de jazzmasterson en flickr.

No hay comentarios: