Cet article fait partie de la série d'exemples de didacticiels Awk en cours. Awk a plusieurs variables intégrées puissantes. Il existe deux types de variables intégrées dans Awk.
- Variable qui définit les valeurs qui peuvent être modifiées telles que le séparateur de champs et le séparateur d'enregistrements.
- Variable qui peut être utilisée pour le traitement et les rapports tels que le nombre d'enregistrements, le nombre de champs.
1. Awk FS Exemple :Saisir une variable de séparation de champ.
Awk lit et analyse chaque ligne à partir de l'entrée en fonction du caractère d'espacement par défaut et définit les variables $1, $2, etc. La variable Awk FS est utilisée pour définir le séparateur de champs pour chaque enregistrement. Awk FS peut être défini sur n'importe quel caractère ou expression régulière. Vous pouvez utiliser le séparateur de champ de saisie en utilisant l'une des deux options suivantes :
- Utilisation de l'option de ligne de commande -F.
- Awk FS peut être défini comme une variable normale.
Syntax: $ awk -F 'FS' 'commands' inputfilename (or) $ awk 'BEGIN{FS="FS";}'
- Awk FS est un caractère unique ou une expression régulière que vous souhaitez utiliser comme séparateur de champ de saisie.
- Awk FS peut être modifié un nombre illimité de fois, il conserve ses valeurs jusqu'à ce qu'il soit explicitement modifié. Si vous souhaitez modifier le séparateur de champs, il est préférable de le modifier avant de lire la ligne. Ce changement affecte donc la ligne de ce que vous lisez.
Voici un exemple awk FS pour lire le fichier /etc/passwd qui a ":" comme délimiteur de champ.
$ cat etc_passwd.awk BEGIN{ FS=":"; print "Name\tUserID\tGroupID\tHomeDirectory"; } { print $1"\t"$3"\t"$4"\t"$6; } END { print NR,"Records Processed"; }
$awk -f etc_passwd.awk /etc/passwd Name UserID GroupID HomeDirectory gnats 41 41 /var/lib/gnats libuuid 100 101 /var/lib/libuuid syslog 101 102 /home/syslog hplip 103 7 /var/run/hplip avahi 105 111 /var/run/avahi-daemon saned 110 116 /home/saned pulse 111 117 /var/run/pulse gdm 112 119 /var/lib/gdm 8 Records Processed
2. Awk OFS Exemple :Variable de séparation de champ de sortie
OFS défectueux est un équivalent en sortie de la variable awk FS. Par défaut, awk OFS est un caractère d'espacement unique. Voici un exemple OFS awk.
$ awk -F':' '{print $3,$4;}' /etc/passwd 41 41 100 101 101 102 103 7 105 111 110 116 111 117 112 119
Le concaténateur dans l'instruction d'impression "," concatène deux paramètres avec un espace qui est la valeur de awk OFS par défaut. Ainsi, la valeur Awk OFS sera insérée entre les champs dans la sortie comme indiqué ci-dessous.
$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd 41=41 100=101 101=102 103=7 105=111 110=116 111=117 112=119
3. Awk RS Exemple :Variable de séparation d'enregistrements
Awk RS définit une ligne. Awk lit ligne par ligne par défaut.
Prenons les notes des élèves qui sont stockées dans un fichier, chaque enregistrement est séparé par un double saut de ligne et chaque champ est séparé par un caractère de saut de ligne.
$cat student.txt Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 65 Edwin 2537 78 67 45 Dayan 2415 30 47 20
Maintenant, le script Awk ci-dessous imprime le nom de l'étudiant et Rollno à partir du fichier d'entrée ci-dessus.
$cat student.awk BEGIN { RS="\n\n"; FS="\n"; } { print $1,$2; } $ awk -f student.awk student.txt Jones 2143 Gondrol 2321 RinRao 2122 Edwin 2537 Dayan 2415
Dans le script student.awk, il lit chaque détail d'étudiant comme un seul enregistrement, car awk RS a été affecté à un double caractère de nouvelle ligne et chaque ligne d'un enregistrement est un champ, puisque FS est un caractère de nouvelle ligne.
4. Awk ORS Exemple :Variable de séparation d'enregistrement de sortie
Awk ORS est un équivalent de sortie de RS. Chaque enregistrement de la sortie sera imprimé avec ce délimiteur. Voici un exemple awk ORS :
$ awk 'BEGIN{ORS="=";} {print;}' student-marks Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=
Dans le script ci-dessus, chaque enregistrement du fichier de notes des élèves est délimité par le caractère "=".
5. Awk NR Exemple :Nombre d'enregistrements Variable
Awk NR vous donne le nombre total d'enregistrements en cours de traitement ou le numéro de ligne. Dans l'exemple awk NR suivant, la variable NR a un numéro de ligne, dans la section END awk NR vous indique le nombre total d'enregistrements dans un fichier.
$ awk '{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}' student-marks Processing Record - 1 Processing Record - 2 Processing Record - 3 Processing Record - 4 Processing Record - 5 5 Students Records are processed
6. Awk NF Exemple :Nombre de champs dans un enregistrement
Awk NF vous donne le nombre total de champs dans un enregistrement. Awk NF sera très utile pour valider si tous les champs existent dans un enregistrement.
Prenons dans le fichier des notes des étudiants, le score Test3 est manquant pour les étudiants comme indiqué ci-dessous.
$cat student-marks Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 Edwin 2537 78 67 45 Dayan 2415 30 47
Le script Awk suivant imprime le numéro d'enregistrement (ligne) et le nombre de champs dans cet enregistrement. Il sera donc très simple de découvrir que le score Test3 est manquant.
$ awk '{print NR,"->",NF}' student-marks 1 -> 5 2 -> 5 3 -> 4 4 -> 5 5 -> 4
7. Awk FILENAME Exemple :Nom du fichier d'entrée actuel
La variable FILENAME donne le nom du fichier en cours de lecture. Awk peut accepter le nombre de fichiers d'entrée à traiter.
$ awk '{print FILENAME}' student-marks student-marks student-marks student-marks student-marks student-marks
Dans l'exemple ci-dessus, il imprime le FILENAME, c'est-à-dire les notes des étudiants pour chaque enregistrement du fichier d'entrée.
8. Exemple Awk FNR :nombre d'enregistrements par rapport au fichier d'entrée actuel
Lorsque awk lit à partir du fichier d'entrée multiple, la variable awk NR donnera le nombre total d'enregistrements relatifs à tous les fichiers d'entrée. Awk FNR vous donnera le nombre d'enregistrements pour chaque fichier d'entrée.
$ awk '{print FILENAME, FNR;}' student-marks bookdetails student-marks 1 student-marks 2 student-marks 3 student-marks 4 student-marks 5 bookdetails 1 bookdetails 2 bookdetails 3 bookdetails 4 bookdetails 5
Dans l'exemple ci-dessus, au lieu de awk FNR, si vous utilisez awk NR, pour le fichier bookdetails vous obtiendrez de 6 à 10 pour chaque enregistrement.
Lecture recommandée
Sed et Awk 101 Hacks, par Ramesh Natarajan . Je passe plusieurs heures par jour sur un environnement UNIX / Linux à gérer des fichiers texte (fichiers de données, de configuration et de journalisation). J'utilise Sed et Awk pour tout mon travail de manipulation de texte. Sur la base de mon expérience Sed et Awk, j'ai écrit Sed and Awk 101 Hacks eBook qui contient 101 exemples pratiques sur diverses fonctionnalités avancées de Sed et Awk qui amélioreront votre vie UNIX / Linux. Même si vous utilisez Sed et Awk depuis plusieurs années et que vous n'avez pas lu ce livre, rendez-vous service et lisez ce livre. Vous serez étonné des capacités des utilitaires Sed et Awk.