🐧
Unix Shell
  • Unix Shell
  • Introduction
    • Introduction
      • 🎉Installation Party
  • 💻L'invite de commandes
    • L'invite de commandes
      • Ouvrir une invite de commandes
      • L'interprète
      • Mes premières commandes
      • Exercice avec ls
      • Raccourcis bash
  • Fichiers et repertoires
    • 📂Fichiers et répertoires
      • Navigation
      • Fichiers : Exercice
      • Edition des fichiers
      • Fichiers spéciaux
  • Recherches
    • 🔍Recherches
      • find
      • Exercice avec find
  • Droits
    • 🔨Droits et permissions
      • Qui
      • Quoi
      • Préciser les droits
  • Packages / Réseau / internet
    • 🌎Le monde extérieur
      • Installer des packages supplémentaires
      • Télécharger des fichiers
      • SSH : Ouvrir un SHELL à distance
      • SCP : Transférer des fichiers
      • Parenthèse : Cryptographie
  • Gestion de la machine
    • 📈Gestion
      • Disques / partitions
      • Exercice : formater et monter une volume (mastère)
      • Les processus
      • Réseau
  • Configurer Apache
    • 🏅Exercice : configurer votre espace web
  • Pipes et redirections
    • 🌊Pipes et redirections
      • Redirections des fichiers
      • grep et les expressions régulières
      • sed : chercher et remplacer
      • awk
  • Scripts
    • 🤖Scripts
      • Exécuter un script
      • Variables
      • Conditions
      • Boucles
      • Fonctions
      • Exercice : un script CGI pour Apache
  • Git
    • 🤖GIT
      • Commandes
      • Branches
      • Déploiement automatique
  • Docker
    • 🐳Docker
      • Lancer des containers
      • Volumes
      • Docker compose
Propulsé par GitBook
Sur cette page
  • awk en bref
  • Exercice avec awk
  1. Pipes et redirections
  2. Pipes et redirections

awk

Précédentsed : chercher et remplacerSuivantScripts

Dernière mise à jour il y a 1 an

AWK est une commande très puissant pour le traitement des commandes :

  • il fonction en tant que commande qui agit sur stdin

  • il fonction en tant qu'interprète comme bash

C'est un language de programmation pour le shell qui peut-être très puissant. Mais il faut d'abord l'étudier :

awk en bref

J'utilise awk typiquement dans l'analyse de logs, parce qu'il y a le moyen d'extraire facilement des colonnes précis, ainsi qu'effectuer des opérations mathématiques (comme l'addition) sur l'ensemble des lignes.

Par exemple, regardez le fichier columnes.txt :

hetic@eabaf4e7983c:~$ cat columns.txt 
1 Hello Kevin 40
2 Goodbye Robert 22
3 Morning Glass 34
4 Evening Matthew 45

On voit qu'il y a 4 colonnes. Si je voulais extraire seulement le 3ème colonne :

cat columns.txt | awk '{ print $3 }'

Ce qui se trouve entre les accolades {} est le language de programmation awk dont la commande print est définie.

Si je voulais trouver la somme de la dernière colonne :

cat columns.txt | awk '{ s+=$4 } END { print s }'

Rien que cette fonctionnalité est très utile dans la manipulation des journaux, par exemple.

Exercice avec awk

Solution

D'abord, téléchargez le fichier :

bash wget https://www.stats.govt.nz/assets/Uploads/Annual-enterprise-survey/Annual-enterprise-survey-2020-financial-year-provisional/Download-data/annual-enterprise-survey-2020-financial-year-provisional-csv.csv

Ensuite regardez la colonne 9 :

head -n 5 annual-enterprise-survey-2020-financial-year-provisional-csv.csv | awk '{ print $9 }'

Oups ! Ce fichier est délimité par une virgule, et pas une espace ! Comment faire ?

Précisez le délimiteur avec le paramètre -F :

head -n 5 annual-enterprise-survey-2020-financial-year-provisional-csv.csv | awk -F',' '{ print $9 }'

Oups, ça ne fonctionne toujours pas. Parce que certaines colonnes contient des virgules au sein des guillemets.

Il me semble que awk tout seul ne sera pas suffisant pour ce problème. On devrait utiliser gnu-awk qui nous donne plus d'options :

sudo apt install gawk
head -n 5 annual-enterprise-survey-2020-financial-year-provisional-csv.csv | gawk -v FPAT='([^,]*)|("[^"]+")'  '{ print $9 }'

Maintenant on a les bonnes valeurs, sauf ils sont lues en tant que string et ne sont pas additionnables. Il faut enlever les guillemets, et transformer la virgule en point :

head -n 5 annual-enterprise-survey-2020-financial-year-provisional-csv.csv | gawk -v FPAT='([^,]*)|("[^"]+")'  '{ gsub("\"","", $9);sub(",", ".", $9);print $9; s+=$9 } END { print s }'

# gsub("\"","", $9) : remplacer les " par rien dans la colonne 9
# sub(",", ".", $9) : remplacer la , par un point dans la colonne 9
# print $9 : afficher pour debogguer
# s+=$9 : faire l'addition

Enfin, on peut trouver la somme de la colonne 9 :

cat annual-enterprise-survey-2020-financial-year-provisional-csv.csv | gawk -v FPAT='([^,]*)|("[^"]+")'  '{ gsub("\"","", $9);sub(",", ".", $9); s+=$9 } END { print s }'

Est-ce que vous pouvez trouver la totale de la colonne 9 (« value ») du fichier .csv ?

Selon , on pourrait préciser plus précisément la forme de chaque colonne :

🌊
awk
cheat-sheet
qui si trouve ici
quelques recherches web