Script shell : lecture dans un fichier et mise en forme

Script shell : lecture dans un fichier et mise en forme - Shell/Batch - Programmation

Marsh Posté le 19-12-2006 à 23:43:31    

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:  
 

Reply

Marsh Posté le 19-12-2006 à 23:43:31   

Reply

Marsh Posté le 20-12-2006 à 05:08:35    

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.
Reply

Marsh Posté le 20-12-2006 à 08:02:08    

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
Reply

Sujets relatifs:

Leave a Replay

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