recuperer le contenu d'un fichier

recuperer le contenu d'un fichier - Shell/Batch - Programmation

Marsh Posté le 08-08-2008 à 21:25:32    

Bonjour,
 
J'essai de faire un petit script en shell me permettant de récupérer le contenu d'un fichier dans une variable pour traiter ensuite les données recueillies.
 
Voilà j'ai un fichier qui contient des adresses ip (toto.txt). Il est formaté de cette façon :
nomduposteclient:adresseipduposteclient
nomduposteclient2:adresseipduposteclient2
nomduposteclient3:adresseipduposteclient3
..
 
Mon but est de récupérer tout ce qui se trouve à gauche et à droite des : pour ensuite envoyer un ping sur le poste (donc mettre tout ça dans une boucle for).
Le problème, c'est que je suis un fervant utilisateur de la programmation perl. Or dans ce cas ci, je ne peux pas l'utiliser (la fonction que j'essai de coder fait partie d'une application open source
dont toutes les fonctions sont codées en shell).
 
J'espère que les guru du shelle pourront m'aider.

Reply

Marsh Posté le 08-08-2008 à 21:25:32   

Reply

Marsh Posté le 08-08-2008 à 21:37:02    

je me répond à moi même, mais si vous avez un meileur code, ca m'interesse. Le traitement ssera plus rapide ;)

 

Voilà donc ma solution :
#!/bin/sh

 

FILE=`cat toto.txt`

 

for X in $FILE
do
 Y=`echo $X | cut -d : -f 1`
 Z=`echo $X | cut -d : -f 2`
 echo "$Y --> $Z"
done

Message cité 1 fois
Message édité par zerros le 08-08-2008 à 21:37:18
Reply

Marsh Posté le 08-08-2008 à 23:25:35    

zerros a écrit :

je me répond à moi même, mais si vous avez un meileur code, ca m'interesse. Le traitement ssera plus rapide ;)
 
Voilà donc ma solution :
#!/bin/sh
 
FILE=`cat toto.txt`
 
for X in $FILE
do
 Y=`echo $X | cut -d : -f 1`
 Z=`echo $X | cut -d : -f 2`
 echo "$Y --> $Z"
done


 
Ton code est celui qu'on trouve généralement soi-même au début du shell car on n'a pas l'habitude de manipuler mais il y a des codes bien meilleurs (et entre parenthèses, la variable $FILE est inutile => for X in `cat toto.txt`). Et accessoirement, utiliser des noms de variables significatifs donne de suite un code bien meilleur => for lig in ...
 
En fait, le problème du for est qu'il découpe ses éléments sur l'espace. Si ton fichier contient des lignes sans espace ça marche sinon ça te coupe les lignes. Donc la solution c'est d'utiliser un truc qui ne prenne pas en compte les espaces. Le meilleur c'est read car lui se cale sur le <return> (et toute ligne finit par un <return> ) en lui demandant de traiter non pas le clavier mais le fichier.
 
Exemple 1: redirection de l'entrée standard

Code :
  1. #!/bin/sh
  2. while read lig
  3. do
  4.     host=`echo $lig | cut -d: -f1`
  5.     ip=`echo $lig | cut -d: -f2`
  6.     echo "$host --> $ip"
  7. done <toto.txt


 
Exemple 2: envoi des infos via pipe

Code :
  1. #!/bin/sh
  2. cat toto.txt |while read lig
  3. do
  4.     host=`echo $lig | cut -d: -f1`
  5.     ip=`echo $lig | cut -d: -f2`
  6.     echo "$host --> $ip"
  7. done


 
Exemple 3: création d'un nouveau canal IO

Code :
  1. #!/bin/sh
  2. # Création du canal
  3. exec 3<toto.txt
  4.  
  5. # On peut même supprimer le fichier car il a été mémorisé
  6. rm -f toto.txt
  7.  
  8. # Lecture du canal 3
  9. while read lig 0<&3
  10. do
  11.     host=`echo $lig | cut -d: -f1`
  12.     ip=`echo $lig | cut -d: -f2`
  13.     echo "$host --> $ip"
  14. done


 
L'avantage de cette soluce est que
1) pas de pipe donc pas de sous-processus (dans l'exemple 2, si t'affiches "$ip" à la fin de la boucle t'auras rien car les variables auront été remplies dans le sous-processus
2) on peut l'étendre pour traiter plusieurs fichiers en parallèle
 

Code :
  1. #!/bin/sh
  2. # Création des canaux sur chaque fichier à lire
  3. exec 3<toto.txt
  4. exec 4<titi.txt
  5. # Boucle de lecture
  6. while true
  7. do
  8.         # Lecture du fichier 1
  9.         read lig1 0<&3
  10.         # Lecture du fichier 2
  11.         read lig2 0<&4
  12.         # Condition de sortie (par exemple une des deux variables vides ce qui indique un EOF sur un des deux fichiers)
  13.         test -z "$lig1" -o -z "$lig2" && break
  14.         # Traitement des lignes
  15.          echo "$lig1 $lig2"
  16. done


Message édité par Sve@r le 09-08-2008 à 08:50:45

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed