GNU/Linux >> Tutoriels Linux >  >> Linux

8 puissantes variables intégrées Awk - FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

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.

  1. Variable qui définit les valeurs qui peuvent être modifiées telles que le séparateur de champs et le séparateur d'enregistrements.
  2. 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 :

  1. Utilisation de l'option de ligne de commande -F.
  2. 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.


Linux
  1. 4 Exemples d'instructions Awk If ( if, if else, if else if, :? )

  2. 7 exemples d'opérateurs Awk puissants (opérateurs unaires, binaires, arithmétiques, de chaîne, d'affectation, conditionnels, Reg-Ex Awk)

  3. 9 puissantes fonctions intégrées Awk pour le numérique

  4. Vérification des variables d'environnement

  5. Est-il possible d'utiliser / dans un nom de fichier ?

Comment enregistrer des screencasts dans GNOME 3

Commande AWK sous Linux avec des exemples

Commande Awk sous Linux

Variables d'environnement Linux

Tutoriel Awk :Comprendre les variables Awk avec 3 exemples pratiques

AWK contre NAWK contre GAWK