Cómo leer un archivo línea por línea usando Shell
Hay muchas formas de leer un archivo línea por línea en Linux, entre las cuales el siguiente método es el más utilizado y es el más eficiente y utilizado.
Para brindarle una sensación intuitiva, probaremos la eficiencia de ejecución de varios métodos generando un archivo grande.
Método 1: El método más eficiente y más utilizado en el bucle while.
El código es el siguiente:
función while_read_LINE_bottm(){
Mientras lee LINE
hacer
echo $LINE
done < $FILENAME
}
Nota: estoy acostumbrado a llamar a este método como lectura, porque este método necesita ejecutar el archivo en el end.Es como leer el archivo después de la ejecución.
Método 2: Método de redireccionamiento; método de canalización: cat $FILENAME | while read LINE
El código es el siguiente:
Función While_read_LINE(){ p>
cat $FILENAME | mientras lee LINE
do
echo $LINE
hecho
}
Nota: Simplemente llamo a este método método de canalización. Deberías poder distinguirlo de la comparación. Cuando se encuentra una tubería, la salida del comando en el lado izquierdo de la tubería se usará como entrada del comando en el lado derecho de la tubería y luego se ingresará.
Método 3: Método de descriptor de archivo
El código es el siguiente:
Función while_read_line_fd(){
Exec 3<&0
Exec 0<$FILENAME
Mientras lee LINE
Hacer
Echo $LINE
Exec 0<& <3
}
Nota: Este método tiene 2 pasos: primero, cierre el descriptor de archivo 0 redirigiendo todo al descriptor de archivo 3. Para esto usamos SyntaxExec 3<&0. La segunda parte coloca el archivo de entrada en el descriptor de archivo 0, que es la entrada estándar.
Método 4 para bucle.
El código es el siguiente:
function for_in_file(){
Para i en `cat $FILENAME`
do p>
echo $i
done
}
Nota: este método consiste en leer el contenido del archivo a través de un bucle for, que es más familiar para todos Bueno, no hay mucho que decir aquí. Pruebe cada método para ver cuál tiene la mayor eficiencia de ejecución.
Primero, utilizamos un script (consulte el archivo adjunto del script) para generar un archivo de 70.000 líneas. La ubicación del archivo es /scripts/bigfile. Luego utilice el siguiente script para probar la eficiencia de ejecución de cada método. El script es muy simple y no se explicará más.
El código es el siguiente:
#!/bin/bash
FILENAME="$1"
TIMEFILE="/tmp /loopfile. out" > $TIMEFILE
SCRIPT=$(nombre base $0)
uso de la función(){
echo -e "\nUSO: $SCRIPT file \n "
salida 1
}
función while_read_bottm(){
mientras lee LINE
hacer
p>echo $LINE
hecho < $FILENAME
}
función while_read_line(){
cat $FILENAME | mientras se lee LINE
hacer
echo $LINE
hecho
}
función while_read_line_fd(){
ejecutivo 3<&0
ejecutivo 0< $FILENAME
mientras lee LINE
haz
echo $LINE
hecho
exec 0<&3
}
función for_in_file(){
para i en ` cat $FILENAME`
hacer
echo $i
hecho
}
if [ $# - lt 1 ] ; entonces
uso
fi
echo -e " \n iniciando el procesamiento de archivos de cada método\n" p>
echo -e "método 1:"
echo -e "función while_read_bottm"
tiempo while_read_bottm >> $TIMEFILE
echo -e "\n"
echo -e "método 2:"
echo -e "función while_read_line "
tiempo while_read_line >> $TIMEFILE
echo - e "\n"
echo -e "método 3:"
echo "función while_read_line_fd"
tiempo while_read_line_fd >>$TIMEFILE
echo -e "\n"
echo -e "método 4:"
echo -e "función for_in_file"
tiempo para_en_archivo >
> $TIMEFILE
Después de ejecutar el script: [root@localhost shell]# ./ while /scripts/bigfile
Contenido de salida del script:
El código es de la siguiente manera:
método 1:
función while_read_bottm
real 0m5.689s
usuario 0m3.399s
sys 0m1 588s
método 2:
función while_read_line
real 0m11.612s
usuario 0m4.031s
sys 0m4.956s
método 3:
función while_read_line_fd
real 0m5.853s
usuario 0m3.536s p>
sys 0m1.469s
método 4:
función for_in_file
real 0m5.153s
usuario 0m3.335s
sys 0m1.593s
A continuación clasificamos cada método según la velocidad.
El código es el siguiente:
real 0m5.153s método 4 (método for loop)
real 0m5.689s método 1 (método while) p>
real 0m5.853s método 3 (método identificador)
real 0m11.612s método 2 (método canalización)
Se puede observar que entre los diversos métodos, el La declaración for es la más eficiente, mientras lee y escribe archivos en el bucle while,
El código es el siguiente:
while read LINE
do El método p>
echo $LINE
done < $FILENAME
tiene la mayor eficiencia de ejecución.