Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1284 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  recuperer le contenu d'un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

recuperer le contenu d'un fichier

n°1771380
zerros
Posté le 08-08-2008 à 21:25:32  profilanswer
 

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.

mood
Publicité
Posté le 08-08-2008 à 21:25:32  profilanswer
 

n°1771382
zerros
Posté le 08-08-2008 à 21:37:02  profilanswer
 

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
n°1771410
Sve@r
Posté le 08-08-2008 à 23:25:35  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  recuperer le contenu d'un fichier

 

Sujets relatifs
upload et download d'un fichiersoucis preg_match sur contenu html
recherche de script permettant de récupérer le contenu d'un fichierRécupérer morceau par morceau le contenu binaire d'un fichier
Récupérer contenu d'un fichier word[C] [réglé] Récupérer le contenu d'un fichier texte ?
Recuperer le contenu d'un fichier en variableRécupérer le contenu d'un fichier distant. readfile(), include().
[php] je dois récupérer le contenu d'un fichier avec un socket...[Perl] récuperer dans une variable le contenu d'un fichier HTML
Plus de sujets relatifs à : recuperer le contenu d'un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR