Posez votre question »

Comment lire un fichier ligne par ligne

Août 2015


Comment lire un fichier ligne par ligne



Préambule


Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier ligne par ligne, est d'utiliser une boucle "for" (for line in $(cat file.txt); do ...), ce qui dans cet exemple conduit à une évaluation, non pas de chaque ligne du fichier, mais de chaque mot ! Ce qui n'est pas du tout le but recherché...

Exemple de sortie avec une boucle "for" :
for line in $(cat file.txt); do echo "$line" ; done  
Ceci  
est  
la  
ligne  
n°  
1  
Ceci  
est  
la  
ligne  
n°  
2  
Ceci  
[...]

La solution consiste à utiliser une boucle "while" couplée à la commande interne "read".

Mais il est cependant possible d'obtenir le même résultat avec une boucle "for" à condition de changer la valeur de la variable "$IFS" (Internal Field Separator, séparateur de champ interne) avant de lancer la boucle. C'est ce que nous verrons par la suite...

Boucle while


La boucle "while" reste la méthode la plus appropriée et la plus simple pour lire un fichier ligne par ligne.

Syntaxe


while read ligne  
do  
   commande  
done < fichier

Exemple


Le fichier de départ :
Ceci est la ligne n° 1  
Ceci est la ligne n° 2  
Ceci est la ligne n° 3  
Ceci est la ligne n° 4  
Ceci est la ligne n° 5

Les instructions en ligne de commande :
while read line; do echo -e "$line\n"; done < file.txt

ou dans un script "bash" :
#! /bin/bash  

while read line  
do   
   echo -e "$line\n"  
done < file.txt

La sortie sur l'écran (stdout) :
Ceci est la ligne n° 1  

Ceci est la ligne n° 2  

Ceci est la ligne n° 3  

Ceci est la ligne n° 4  

Ceci est la ligne n° 5

Astuces


Il vous est tout à fait possible à partir d'un fichier structuré (comme un carnet d'adresse ou /etc/passwd par exemple), de récupérer les valeurs de chaque champ et de les affecter à plusieurs variables avec la commande "read". Attention toutefois de bien assigner à la variable "IFS" le bon séparateur de champ (espace par défaut).

Exemple :
#! /bin/bash  

while IFS=: read user pass uid gid full home shell  
do  
echo -e "$full :\n\  
 Pseudo : $user\n\  
 UID :\t $uid\n\  
 GID :\t $gid\n\  
 Home :\t $home\n\  
 Shell :\t $shell\n\n"  
done < /etc/passwd

Bonus


while read i; do echo -e "Paramètre : $i"; done < <(echo -e "a\nab\nc")

Boucle for


Si la boucle "while" reste la méthode la plus simple, elle a toutefois un inconvénient majeur, à savoir qu'elle annihile le formatage des lignes et notamment les espaces et tabulations ;-\
Heureusement la boucle "for" couplée avec un changement d'IFS permet de garder la structure du document en sortie.

Syntaxe


old_IFS=$IFS     # sauvegarde du séparateur de champ  
IFS=$'\n'     # nouveau séparateur de champ, le caractère fin de ligne  
for ligne in $(cat fichier)  
do  
   commande  
done  
IFS=$old_IFS     # rétablissement du séparateur de champ par défaut

Pour une lecture illimitée hors ligne, vous avez la possibilité de télécharger gratuitement cet article au format PDF :
Comment-lire-un-fichier-ligne-par-ligne.pdf

Réalisé sous la direction de , fondateur de CommentCaMarche.net.

A voir également

Dans la même catégorie

How to read a file line by line
Par deri58 le 22 février 2009
Cómo leer un archivo línea por línea
Par Carlos-vialfa le 11 août 2008
Como ler um arquivo linha por linha
Par pintuda le 15 décembre 2009
Publié par jipicy. - Dernière mise à jour par aquarelle
Ce document intitulé «  Comment lire un fichier ligne par ligne  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.