awk imprimer des lignes en fonction du nombre de champ
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)