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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Script shell : lecture dans un fichier et mise en forme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Script shell : lecture dans un fichier et mise en forme

n°1493833
XK
Posté le 19-12-2006 à 23:43:31  profilanswer
 

Bonjour
 
J'ai un script à faire dans lequel je dois récupérer des adresses IP qui se trouvent dans le fichier HOST de la machine.
Je dois mettre dans une variable les adresses IP des certains PC, cela uniquement avec des commandes shell simples.
 
Structures du fichier host:

192.168.1.1 PC1
192.168.1.2 PC2
192.168.1.3 MAC1
192.168.1.4 MAC2
...


 
Disons que je souhaite récupérer uniquement les IP des PC, je dois obtenir l'équivalent de "192.168.1.1,192.168.1.2".
 
Pour commencer j'arrive à récupérer les infos, à supprimer le retour chariot, mais j'aimerai ne récupérer que l'adresse IP et pas le nom de la machine, et les séparer par une virgule... Pour le moment j'ai ça :

$ cat /etc/hosts | grep PC | tr -d "\n"
192.168.1.1 PC1192.168.1.2 PC2


Il me faudrai une commande qui permette de garder que la première partie de la ligne avant l'espace.
 
Merci de m'aider :hello:  
 

mood
Publicité
Posté le 19-12-2006 à 23:43:31  profilanswer
 

n°1493865
Sve@r
Posté le 20-12-2006 à 05:08:35  profilanswer
 

XK a écrit :

Bonjour
 
J'ai un script à faire dans lequel je dois récupérer des adresses IP qui se trouvent dans le fichier HOST de la machine.
Je dois mettre dans une variable les adresses IP des certains PC, cela uniquement avec des commandes shell simples.
 
Structures du fichier host:

192.168.1.1 PC1
192.168.1.2 PC2
192.168.1.3 MAC1
192.168.1.4 MAC2
...


 
Disons que je souhaite récupérer uniquement les IP des PC, je dois obtenir l'équivalent de "192.168.1.1,192.168.1.2".
 
Pour commencer j'arrive à récupérer les infos, à supprimer le retour chariot, mais j'aimerai ne récupérer que l'adresse IP et pas le nom de la machine, et les séparer par une virgule... Pour le moment j'ai ça :

$ cat /etc/hosts | grep PC | tr -d "\n"
192.168.1.1 PC1192.168.1.2 PC2


Il me faudrai une commande qui permette de garder que la première partie de la ligne avant l'espace.
 
Merci de m'aider :hello:


 
La commande "cut" te permet d'isoler une ou plusieurs colonnes d'un fichier. Etant donné qu'il s'agit du fichier "/etc/hosts" qui est suceptible de contenir des lignes commentées par un "#", il vaut mieux filtrer le cut par un grep pour supprimer ces lignes
Exemple

grep -v "^#" /etc/hosts |grep "PC" |cut -f1 -d" "


Cette commande te donnera les IP en colonne. Toi, tu les veux sur une seule ligne. Pour ça, il y a plusieurs façons de faire. On peut par exemple prendre chaque IP une à une et l'afficher sans mettre de "return", ex:

grep -v "^#" /etc/hosts |grep "PC" |cut -f1 -d" " |while read IP
do
    echo -n "$IP,"
done
echo


 
Le traitement fonctionne mais sera un petit peu long. On peut aussi filtrer le cut par un "awk" qui possède l'avantage d'être hyper rapide et de ne pas afficher de return si on ne le lui demande pas, et de pouvoir isoler les mots ce qui évite de passer par le "cut", ex:

grep -v "^#" /etc/hosts |grep "PC" |awk '{printf("%s,", $1)} END {print}'


 
Bon, les 2 exemples fonctionnent. Leur seul défaut est d'afficher une virgule de trop. On peut aussi supprimer cela par un traitement "awk" un petit peu plus compliqué ou j'initialise une variable "virg" à vide que j'affiche avant l'IP. Et à partir du premier affichage, je lui mets le caractère "," donc à partir de la 2° ligne jusqu'à la fin, j'aurais la virgule affichée avant l'IP

grep -v "^#" /etc/hosts |grep "PC" |awk 'BEGIN {virg=""} {printf("%s%s", virg, $1); virg=","} END {print}'


 
On peut même utiliser un algo plus complexe dans le "awk" pour filtrer les commentaires et ne prendre que les lignes contenant le mot "PC" ce qui aurait l'avantage de supprimer aussi les "grep" (moins il y a de filtre plus c'est rapide). Mais le vrai pb est que tu sois venu ici pour demander un truc aussi simple. Tu devrais te familiariser sèrieusement avec ces commandes de traitement de fichier texte que sont
- grep
- cut
- sed
- tr
- sort
- awk
Et les possibilités que tu as de les assembler via le shell => http://fr.lang.free.fr/cours/Shell_v1.4.pdf


Message édité par Sve@r le 20-12-2006 à 05:13:33

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1493870
XK
Posté le 20-12-2006 à 08:02:08  profilanswer
 

Merci beaucoup pour ton post très très complet, je n'ai vraiment plus rien à faire :D
 
Je n'ai eu que quelques minutes hier pour me pencher sur le problème, merci pour le cours sur le shell ça me sera très utile!  
 
Je voulais éviter d'utiliser awk car le script étant exécuté sur un système embarqué je ne sais pas si il est disponnible, il faut que je me renseigne.
Sans awk voici la commande pas du tout optimale qui fonctionne :

grep -v "^#" /etc/hosts | grep "PC" | cut -f1 -d " " | tr -s "\n" "," | sed 's/.\{1\}$//' | tr -d "\n"


 
Si awk est disponible, j'utiliserai ton exemple bien entendu :hello:


Message édité par XK le 20-12-2006 à 15:01:56

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

  Script shell : lecture dans un fichier et mise en forme

 

Sujets relatifs
Dialoguer avec le shell d'un serveur en sshenvoi d'un fichier par FTP sans le créer en local
Prblm lecture fichier wmgenerer un fichier texte et l'envoyer dans un dossier
Emuler une frappe clavier à partir d'un fichier txt[Fortran] Lecture de données ds un fichier (facile je pense)
le transfert de fichier sur le reseau (avec Ada)Comment ouvrir un fichier .xfs?
Plus de sujets relatifs à : Script shell : lecture dans un fichier et mise en forme


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