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