next up previous contents index
suivant: Programme obtenu monter: Tri par adresse IP précédent: Méthode utilisée   Table des matières   Index

Développement

Comme tout script UNIX, le but est de n'utiliser, dans la mesure du possible, aucun fichier temporaire. Comme il l'a été développé au paragraphe précédent, il est clair que les résultats s'enchainent les uns aux autres. Nous utiliserons donc les mécanismes de redirection d'entrée/sortie et des filtres.

Après les commentaires d'entête d'usage, la première chose à faire est de reformater le fichier "hosts(5)" pour l'envoyer à la commande de tri "sort(1)". Pour cela, nous utiliserons la commande "sed(1)". Celle-ci nous servira, dans un premier temps, à supprimer les éventuels commentaires du fichier (pour plus de détails, cf. [*]). Nous aurons donc :

sed -e '/^#.*/d' -e 's/#.*$//' /etc/hosts

Dans un deuxième temps, la commande "sed(1)" va nous servir à reformater l'adresse IP, afin de substituer le caractère "." par le caractère ":". Sachant que le format d'une telle adresse est composé de quatre nombres séparés par ".", l'expression régulière suivante la décrit parfaitement :

[0-9]{3}\.[0-9]{3}\.[0-9]{3}\.[0-9]{3}
Par conséquent, toute ligne du fichier "host(5)" peut être décrite par l'expression suivante :
\([0-9]{3}\)\.\([0-9]{3}\)\.\([0-9]{3}\)\.\([0-9]{3}\)\(.*$\)
Ce qui nous permet d'avoir les références suivantes pour l'expression régulière :
Référence Description
\1 Premier champ numérique de l'adresse IP.
\2 Second champ numérique de l'adresse IP.
\3 Troisième champ numérique de l'adresse IP.
\4 Quatrième champ numérique de l'adresse IP.
\5 Noms de la machine.
Nous pourrons donc écrire la requête de substitution suivante :
s/\([0-9]{3}\)\.\([0-9]{3}\)\.\([0-9]{3}\)\.\([0-9]{3}\)\(.*$\)/\1:\2:\3:\4:\5/
Ce qui nous donne :
sed -e '/^#.*/d' -e 's/#.*$//' /etc/hosts    |\
  sed -e \
    's/\([0-9]{3}\)\.\([0-9]{3}\)\.\([0-9]{3}\)\.\([0-9]{3}\)\(.*$\)/\1:\2:\3:\4:\5/'

Il ne reste plus qu'à effectuer le tri sachant que :

Nous obtenons :
sed -e '/^#.*/d' -e 's/#.*$//' /etc/hosts    |\
  sed -e \
    's/\([0-9]{3}\)\.\([0-9]{3}\)\.\([0-9]{3}\)\.\([0-9]{3}\)\(.*$\)/\1:\2:\3:\4:\5/' |\
  sort -t: +n

Il faut maintenant reformater le résultat pour obtenir celui qui est conforme au fichier "hosts(5)". Nous allons ici utiliser lLa commande "awk(1)". Celle-ci recevra donc des lignes (ou enregistrements) séparés par le caractère ":" et devra effectuer le traitement suivant pour chacunes :

Nous avons donc :
awk '
    BEGIN { FS=":" }
    {
        printf ("%d.%d.%d.%d%s\n", ^$1, $2, $3, $4, $5)
    }
  '


next up previous contents index
suivant: Programme obtenu monter: Tri par adresse IP précédent: Méthode utilisée   Table des matières   Index
baudry@esme.fr