[Script Shell] Lire un fichier ligne par ligne

Autres projets et contributions
Avatar de l’utilisateur
TuxSpirit
Chu Ko Nu
Messages : 338
Inscription : jeu. 08 nov. 2007, 14:11
Localisation : Suisse/VD

[Script Shell] Lire un fichier ligne par ligne

Message 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
Amicalement,
TuxSpirit
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Message 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
Avatar de l’utilisateur
TuxSpirit
Chu Ko Nu
Messages : 338
Inscription : jeu. 08 nov. 2007, 14:11
Localisation : Suisse/VD

Message 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
Amicalement,
TuxSpirit
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message 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
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Message par tuxce »

Avatar de l’utilisateur
TuxSpirit
Chu Ko Nu
Messages : 338
Inscription : jeu. 08 nov. 2007, 14:11
Localisation : Suisse/VD

Message par TuxSpirit »

tuxe : merci pour les liens :D

wain: merci pour l'exemple avec la boucle "while read" :D
Amicalement,
TuxSpirit
Répondre