GNU/Linux >> Tutoriels Linux >  >> Linux

Un guide du débutant pour rester bouche bée

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.


Linux
  1. Un guide pratique pour apprendre awk

  2. Extraire et afficher des données avec awk

  3. Principes de base de Linux :Guide du débutant pour l'édition de texte avec vim

  4. Guide du débutant sur le pare-feu sous Linux

  5. Guide complet du débutant sur la journalisation Docker

Comment utiliser AppImage sur Linux (Guide du débutant)

Guide du débutant sur la politique de redémarrage de Docker

50 commandes Raspberry Pi utiles – Guide du débutant

Guide du débutant pour analyser les journaux sous Linux avec la commande journalctl

Guide du débutant sur Syslogs sous Linux

Tirer parti de PowerShell sous Linux :Guide du débutant