gawk est l'implémentation GNU du langage de programmation Awk, initialement développé pour le système d'exploitation UNIX dans les années 1970. Le langage de programmation Awk est spécialisé dans le traitement du formatage des données dans les fichiers texte, en particulier les données textuelles organisées en colonnes.
À l'aide du langage de programmation Awk, vous pouvez manipuler ou extraire des données, générer des rapports, faire correspondre des modèles, effectuer des calculs, etc., avec une grande flexibilité. Awk vous permet d'accomplir des tâches quelque peu difficiles avec une seule ligne de code. Pour obtenir les mêmes résultats en utilisant des langages de programmation traditionnels tels que C ou Python, il faudrait des efforts supplémentaires et de nombreuses lignes de code.
gawk
fait également référence à l'utilitaire de ligne de commande disponible par défaut avec la plupart des distributions Linux. La plupart des distributions fournissent également un lien symbolique pour awk
pointant vers gawk
. Pour plus de simplicité, à partir de maintenant, nous ferons référence à l'utilitaire uniquement en tant que awk
.
awk
traite les données directement à partir de l'entrée standard - STDIN. Un modèle courant consiste à diriger la sortie d'autres programmes vers awk
pour extraire et imprimer des données, mais awk
peut également traiter les données des fichiers.
Dans cet article, vous utiliserez awk
pour analyser les données d'un fichier avec des colonnes séparées par des espaces. Commençons par examiner les exemples de données.
Exemples de données
Pour les exemples de ce guide, utilisons la sortie de la commande ps ux
enregistré dans le fichier psux.out
. Voici un exemple des données du fichier :
$ head psux.out
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
ricardo 1446 0.0 0.2 21644 11536 ? Ss Sep10 0:00 /usr/lib/systemd/systemd --user
ricardo 1448 0.0 0.1 49212 5848 ? S Sep10 0:00 (sd-pam)
ricardo 1459 0.0 0.1 447560 7148 ? Sl Sep10 0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
ricardo 1467 0.0 0.1 369144 6080 tty2 Ssl+ Sep10 0:00 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session
ricardo 1469 0.0 0.1 277692 4112 ? Ss Sep10 0:00 /usr/bin/dbus-broker-launch --scope user
ricardo 1471 0.0 0.1 6836 4408 ? S Sep10 0:00 dbus-broker --log 4 --controller 11 --machine-id 16355057c7274843823dd747f8e2978b --max-bytes 100000000000000 --max-fds 25000000000000 --max-matches 5000000000
ricardo 1474 0.0 0.3 467744 14132 tty2 Sl+ Sep10 0:00 /usr/libexec/gnome-session-binary
ricardo 1531 0.0 0.1 297456 4280 ? Ssl Sep10 0:00 /usr/libexec/gnome-session-ctl --monitor
ricardo 1532 0.0 0.3 1230908 12920 ? S<sl Sep10 0:01 /usr/bin/pulseaudio --daemonize=no
Vous pouvez télécharger le fichier complet à partir d'ici, en utilisant cette commande :
$ curl -o psux.out https://gitlab.com/-/snippets/2013935/raw\?inline\=false
Si vous décidez d'utiliser la sortie de ps ux
sur votre système, ajustez les valeurs indiquées dans les exemples pour qu'elles correspondent à vos résultats.
Ensuite, utilisons awk
pour afficher les données du fichier d'exemple.
Utilisation de base
Un awk
de base programme se compose d'un motif suivi d'une action entre accolades. Vous pouvez fournir un programme au awk
utilitaire en ligne en le plaçant entre guillemets simples, comme ceci :
$ awk 'pattern { action }'
awk
traite les données d'entrée (entrée standard ou fichier) ligne par ligne, en exécutant l'action donnée pour chaque ligne (ou enregistrement) qui correspond au modèle. Si le motif est omis, awk
exécute l'action sur tous les enregistrements. Une action peut être aussi simple que l'impression de données à partir de la ligne ou aussi complexe qu'un programme complet. Par exemple, pour imprimer toutes les lignes du fichier d'exemple, utilisez cette commande :
$ awk '{ print }' psux.out
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
ricardo 1446 0.0 0.2 21644 11536 ? Ss Sep10 0:00 /usr/lib/systemd/systemd --user
.... OUTPUT TRUNCATED ....
Bien que cet exemple ne soit pas vraiment utile, il illustre le awk
utilisation de base de la commande.
Si vous utilisez la commande ps ux
sur votre machine, vous pouvez diriger sa sortie directement dans awk
, au lieu de fournir le nom du fichier d'entrée :
$ ps ux | awk '{ print }'
Ensuite, utilisons awk
capacités de traitement de colonne pour extraire une partie des données du fichier d'exemple.
Champs d'impression
La puissance de awk
commence à devenir évident lorsque vous utilisez ses fonctionnalités de traitement de colonne. awk
divise automatiquement chaque ligne (ou enregistrement) en champs. Par défaut, il utilise l'espace caractère pour séparer chaque champ, mais vous pouvez le modifier en fournissant le paramètre de ligne de commande -F
suivi du séparateur souhaité.
Après le fractionnement, awk
affecte chaque champ à une variable numérotée, commençant par le caractère $
. Par exemple, le premier champ est $1
, le deuxième $2
, etc. La variable spéciale $0
contient l'intégralité de l'enregistrement avant le fractionnement.
En utilisant les variables de champ, vous pouvez extraire des données de l'entrée. Par exemple, pour imprimer uniquement le nom de la commande à partir du fichier d'exemple, utilisez la variable $11
car le nom de la commande est la onzième colonne de chaque ligne :
$ awk '{ print $11 }' psux.out
COMMAND
/usr/lib/systemd/systemd
(sd-pam)
/usr/bin/gnome-keyring-daemon
.... OUTPUT TRUNCATED ....
Vous pouvez également imprimer plusieurs champs en les séparant par des virgules. Par exemple, pour imprimer le nom de la commande et l'utilisation du processeur sur la troisième colonne, utilisez cette commande :
$ awk '{ print $11, $3 }' psux.out
COMMAND %CPU
/usr/lib/systemd/systemd 0.0
(sd-pam) 0.0
/usr/bin/gnome-keyring-daemon 0.0
.... OUTPUT TRUNCATED ....
Enfin, utilisez le printf
intégré fonction pour formater la sortie et aligner les colonnes. Fournissez un remplissage de 40 caractères à droite des premières colonnes pour accueillir des noms de commande plus longs :
$ awk '{ printf("%-40s %s\n", $11, $3) }' psux.out
COMMAND %CPU
/usr/lib/systemd/systemd 0.0
(sd-pam) 0.0
/usr/bin/gnome-keyring-daemon 0.0
/usr/libexec/gdm-wayland-session 0.0
.... OUTPUT TRUNCATED ....
Maintenant que vous pouvez manipuler et extraire des champs individuels de chaque enregistrement, appliquons la fonctionnalité de modèle pour filtrer les enregistrements.
[ Vous pourriez également aimer : Manipuler du texte sur la ligne de commande avec sed ]
Correspondance de modèle
En plus de manipuler les champs, awk
vous permet de filtrer les enregistrements sur lesquels exécuter des actions grâce à une puissante fonction de correspondance de modèles. Dans son utilisation la plus basique, fournissez une expression régulière délimitée par une barre oblique /
caractères pour correspondre aux enregistrements. Par exemple, pour filtrer par enregistrements qui correspondent à firefox , utilisez /firefox/
:
$ awk '/firefox/ { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
Vous pouvez également utiliser des champs et une expression de comparaison comme critères de correspondance de modèles. Par exemple, pour imprimer les données du processus qui correspond au PID 6685, comparez le champ $2
, comme ceci :
$ awk '$2==6685 { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 0.0
awk
est suffisamment intelligent pour comprendre les champs numériques, ce qui vous permet d'utiliser des comparaisons relatives telles que supérieur ou inférieur à. Par exemple, pour afficher tous les processus qui utilisent plus de 5 % de CPU , utilisez $3 > 5
:
$ awk '$3 > 5 { print $11, $3 }' psux.out
/usr/bin/gnome-shell 5.1
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
Vous pouvez combiner des modèles avec des opérateurs. Par exemple, pour afficher tous les processus qui correspondent à firefox et utiliser plus de 5 % de CPU , combinez les deux modèles avec le &&
opérateur pour un AND
logique :
$ awk '/firefox/ && $3 > 5 { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
Enfin, parce que vous utilisez la correspondance de modèle, awk
n'imprime plus la ligne d'en-tête. Vous pouvez ajouter votre propre ligne d'en-tête en utilisant le BEGIN
modèle pour exécuter une seule action avant de traiter des enregistrements :
$ awk 'BEGIN { printf("%-26s %s\n", "Command", "CPU%")} $3 > 10 { print $11, $3 }' psux.out
Command CPU%
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
Ensuite, manipulons les données dans des champs individuels.
Manipulation de champ
Comme nous en avons discuté dans la section précédente, awk
comprend les champs numériques. Cela vous permet d'effectuer des manipulations de données, y compris des calculs numériques. Par exemple, pensez à imprimer l'utilisation de la mémoire sur la colonne six pour tous les firefox processus :
$ awk '/firefox/ { print $11, $6 }' psux.out
/usr/lib64/firefox/firefox 301212
/usr/lib64/firefox/firefox 118220
/usr/lib64/firefox/firefox 168468
/usr/lib64/firefox/firefox 101520
/usr/lib64/firefox/firefox 194336
/usr/lib64/firefox/firefox 111864
/usr/lib64/firefox/firefox 163440
/usr/lib64/firefox/firefox 38496
/usr/lib64/firefox/firefox 174636
/usr/lib64/firefox/firefox 37264
/usr/lib64/firefox/firefox 30608
/usr/lib64/firefox/firefox 174636
/usr/lib64/firefox/firefox 174660
La commande ps ux
affiche l'utilisation de la mémoire en kilo-octets, ce qui est difficile à lire. Convertissons-le en mégaoctets en plongeant la valeur du champ par 1024 :
$ awk '/firefox/ { print $11, $6/1024 }' psux.out
/usr/lib64/firefox/firefox 294.152
/usr/lib64/firefox/firefox 115.449
/usr/lib64/firefox/firefox 164.52
/usr/lib64/firefox/firefox 99.1406
/usr/lib64/firefox/firefox 189.781
/usr/lib64/firefox/firefox 109.242
/usr/lib64/firefox/firefox 159.609
/usr/lib64/firefox/firefox 37.5938
/usr/lib64/firefox/firefox 170.543
/usr/lib64/firefox/firefox 36.3906
/usr/lib64/firefox/firefox 29.8906
/usr/lib64/firefox/firefox 170.543
/usr/lib64/firefox/firefox 170.566
Vous pouvez également arrondir les nombres et ajouter le suffixe Mo en utilisant printf
pour améliorer la lisibilité :
$ awk '/firefox/ { printf("%s %4.0f MB\n", $11, $6/1024) }' psux.out
/usr/lib64/firefox/firefox 294 MB
/usr/lib64/firefox/firefox 115 MB
/usr/lib64/firefox/firefox 165 MB
/usr/lib64/firefox/firefox 99 MB
/usr/lib64/firefox/firefox 190 MB
/usr/lib64/firefox/firefox 109 MB
/usr/lib64/firefox/firefox 160 MB
/usr/lib64/firefox/firefox 38 MB
/usr/lib64/firefox/firefox 171 MB
/usr/lib64/firefox/firefox 36 MB
/usr/lib64/firefox/firefox 30 MB
/usr/lib64/firefox/firefox 171 MB
/usr/lib64/firefox/firefox 171 MB
Enfin, combinez cette idée avec le BEGIN
et END
modèles pour effectuer une manipulation de données plus avancée. Par exemple, calculons l'utilisation totale de la mémoire pour tous les firefox processus en définissant une variable somme dans le BEGIN
action, en ajoutant la valeur de la colonne six $6
pour chaque ligne qui correspond à firefox à la somme variable, puis l'imprimer avec le END
action en mégaoctets :
$ awk 'BEGIN { sum=0 } /firefox/ { sum+=$6 } END { printf("Total Firefox memory: %.0f MB\n", sum/1024) }' psux.out
Total Firefox memory: 1747 MB
[ Télécharger maintenant :Un guide de l'administrateur système sur les scripts Bash. ]
Quelle est la prochaine ?
gawk
est un outil puissant et flexible pour traiter les données textuelles, en particulier les données disposées en colonnes. Cet article a fourni quelques exemples utiles d'utilisation de cet outil pour extraire et manipuler des données, mais gawk
peut faire beaucoup plus. Pour plus d'informations sur gawk
, consultez les pages de manuel de votre distribution Linux.
Le langage Awk a beaucoup plus de ressources que ce que nous avons exploré dans ce guide. Pour des informations détaillées à ce sujet, consultez le Guide de l'utilisateur officiel de GNU Awk.