Petite note pour me rappeller comment j’ai pu sélectionner des lignes dans un fichier en fonction d’un critère sur une partie de la ligne.

Dans un fichier contenant une liste d’adresses IP, de hostname et de commentaires (liste issue d’une concaténation de fichiers hosts), j’ai eu besoin d’extraire les lignes contenant une adresse et un hostname ; certaines lignes contenaient une adresse IP et un commentaire uniquement.
Pour cela j’ai utilisé la commande awk.

Le fichier d’entrée est du type suivant :

    adresse1 hostname1 # commentaire
    adresse2 hostname21 hostname22 # commentaire
    adresse3 # commentaire

Certaines lignes comportent un ou plusieurs hostname alors que pour d’autres lignes le hostname est absent.

Pour tester la présence de un ou plusieurs hostname, il faut scinder la ligne en 2 parties (le caractère de séparation étant le #), ensuite il faut tester le nombre d’éléments de la première partie de cette ligne.

Pour scinder une ligne en 2 parties avec awk et afficher uniquement la première, il faut utiliser la commande:

    awk '{BEGIN { FS="#";} print $1}' mon-fichier

Explications :

  • FS="#" : on fixe le délimiteur de champ pour la ligne du fichier
  • print $1 : on imprime le premier champ obtenu ($0 étant la ligne entière)

Pour scinder le premier champ de la ligne, il faut utiliser la commande split.
La commande suivante affichera le nombre d’éléments du premier champ et l’adresse IP qui est la première partie du premier champ :

    awk 'BEGIN { FS="#";} {n=split($1,Adresse," ");print n,Adresse[1];}' mon-fichier

Explications :

  • FS="\#" : on fixe le délimiteur de champ pour la ligne du fichier
  • n=split($1,Adresse," ") : le premier champ ($1) est découpé en éléments et le résultat est renvoyé dans le tableau Adresse, le séparateur est ici le caractère espace. Le nombre d’éléments du tableau Adresse est renvoyé dans la variable n
  • print n,Adresse[1] : on imprime le nombre d’élément du premier champ de la ligne (variable n) et l’adresse IP qui est contenue dans le premier élément du tableau Adresse

Pour obtenir les lignes contenant une adresse IP avec au moins un hostname, il suffit donc de tester le nombre d’éléments du tableau Adresse et d’imprimer la ligne en fonction du résultat :

    awk 'BEGIN { FS="#";} {n=split($1,Adresse," ");if (n>1){print n,$0;}}'

Explications :

  • FS="#" : on fixe le délimiteur de champ pour la ligne du fichier
  • n=split($1,Adresse," ") : le premier champ ($1) est découpé en éléments et le résultat est renvoyé dans le tableau Adresse, le séparateur est ici le caractère espace. Le nombre d’éléments du tableau Adresse est renvoyé dans la variable n
  • f (n>1){print n,$0;}` : si le tableau Adresse contient plus d’un élément, alors on imprime le nombre d’éléments du premier champ (n)  suivi de la ligne en entier ($0)