Page 1 sur 1

[Script Shell] Lire un fichier ligne par ligne

Publié : jeu. 27 mars 2008, 10:39
par TuxSpirit
Ce petit script permet de lire un fichier texte ligne par ligne et de faire un traitement de ces dernières. On peut les traiter soit par le no de la ligne ou son contenu.

Pour l'exemple, on imagine qu'on ait un fichier demo.conf dans notre répertoire Home et que le contenu du fichier soit :
Archlinux
2007.08-2
i686

Code : Tout sélectionner

#!/bin/sh

#Emplacement du fichier texte a traiter
file=$HOME/demo.conf

#Initialisation du compteur x=0

#Initialisation de la boucle pour la lecture du fichier ligne par ligne
while [ $x -lt `(wc -l <$file` ]; do

#Incrémentation du compteur de 1 
x=$(($x+1))

#Lecture de la ligne entière et récupération de la valeur dans la variable ln
ln=`head -n $x $file | tail -n 1`

#Traitement de la ligne selon son numéro
if [ $x -eq 1]; then
   echo "Distribution : " ${ln}
elif [ $x -eq 2]; then
   echo "Version :" ${ln}
elif [ $x -eq 3]; then
   echo "Architecture :" ${ln}
fi

#Fin de lecture du fichier
done

#Fermeture du script
exit 0
Nous aurions comme résultat à l'écran :
Distribution : Archlinux
Version : 2007.08-2
Architecture : i686
Maintenant, si nous aurions voulu traiter le fichier directement par le contenu de la ligne, sans s'occuper de son numéro, il suffit de remplacer la partie :

Code : Tout sélectionner

#Traitement de la ligne selon son numéro
if [ $x -eq 1]; then
   echo "Distribution : " ${ln}
elif [ $x -eq 2]; then
   echo "Version :" ${ln}
elif [ $x -eq 3]; then
   echo "Architecture :" ${ln}
fi
par ceci par exemple :

Code : Tout sélectionner

#Traitement de la ligne selon son contenu
if [ "${ln}" == "i686" ]; then
     echo "Le dépôt est : http://repo.archlinux.fr/i686/"
else
     echo "Le dépôt est : http://repo.archlinux.fr/x86_64/"
if

Publié : jeu. 27 mars 2008, 12:33
par tuxce
pourquoi tu n'utilises pas plutot awk:

Code : Tout sélectionner

awk '{  if (NR == 1) print "Distribution : "$0
  if (NR == 2) print "Version : "$0
  if (NR == 3) print "Architecture : "$0
}' nom_du_fichier
ou créer d'abord le fichier de règle puis l'appeler avec le "-f":

Code : Tout sélectionner

NR==1 { $0="Distribution : "$0 }
{ print $0 }
pour le traitement selon le contenu:

Code : Tout sélectionner

/i686/ { print "Le dépôt est : http://repo.archlinux.fr/i686/" }
!/i686/ { print "Le dépôt est : http://repo.archlinux.fr/x86_64/" }
ca évite de faire appel à plusieurs programmes

Publié : jeu. 27 mars 2008, 17:40
par TuxSpirit
ben tout simplement parce que je ne connais pas awk. la 1ère fois que j'en entends parler.

tu connais un bon wiki / tutorial pour awk.

merci tuxce

Publié : jeu. 27 mars 2008, 18:25
par wain
Puisque le sujet est "Lire un fichier ligne par ligne", n'oublions pas la boucle "while read":

Code : Tout sélectionner

cat fichier |
while read line; do
    echo $line
done
C'est pas le meilleur exemple mais voici ce que ça donnerait dans notre cas:

Code : Tout sélectionner

#!/bin/sh 
#Emplacement du fichier texte a traiter 
file=$HOME/demo.conf 

#Initialisation du compteur 
x=0 

#Boucle pour la lecture du fichier ligne par ligne 
cat $file |
while read line; do 
    #Incrémentation du compteur de 1 
    x=$(($x+1)) 

    #Traitement de la ligne selon son numéro 
    case $x in
      1) echo "Distribution : $line";;
      2) echo "Version : $line";;
      3) echo "Architecture : $line";; 
    esac
done 

#Fermeture du script 
exit 0

Publié : jeu. 27 mars 2008, 19:12
par tuxce

Publié : ven. 28 mars 2008, 09:31
par TuxSpirit
tuxe : merci pour les liens :D

wain: merci pour l'exemple avec la boucle "while read" :D