Aéroport de Lyon.

Unix (ou bash) pour journalistes

Quelques commandes de l’antique système d’exploitation pouvant s’avérer utiles à des fins journalistiques en ce début de XXIe siècle


Toutes les commandes décrites dans cette page fonctionnent si vous vous servez d’un ordinateur disposant du système d’exploitation Linux, sinon en ouvrant l’application Terminal sur un ordinateur fonctionnant sous MacOSX.

Avec Cloud9

Ancien logo de c9

Pour celles et ceux qui ont un ordinateur Windows, je proposais antérieurement, pour les besoins du cours EDM5240, le service en ligne Cloud9, qui offre un environnement de développement en ligne. Mais depuis que Cloud9 a été racheté par Amazon Web Services, il est beaucoup plus difficile à utiliser. Il faut passer par le menu hyper chargé de l’ensemble des services AWS, puis une fois qu’on le trouve, il est beaucoup plus long qu’autrefois à démarrer…

Il faut s’ouvrir un compte sur AWS. Puis, repérer Cloud9 dans toute la panoplie de services (indice: 2e colonne à partir de la gauche, dans la section «Outils pour développeurs»).

Vous pourrez alors lancer un nouvel espace de travail (un «workspace») qui reproduit un environnement de développement pour programmeurs.

Une fois cet espace démarré, on va travailler dans l’espace à fond bleu pâle identifié par un onglet appelé «bash - …» qui se trouve en bas. C’est ce qui reproduit le Terminal des machines Linux ou Mac. Vous y voyez :

<votre nom>:~/environment $

C’est là, juste après le symbole $, qu’on appelle en bon français l’«invite de commande» (command prompt), que vous allez entrer les différentes commandes que nous allons décrire ci-dessous.

Si vous ne voyez pas cet espace, choisissez «New Terminal» dans l’onglet Windows.

PyCharm Community Edition

Avec PyCharm

Il y a une alternative intéressante à Cloud9 pour qui possède un ordinateur Windows. Il s’agit d’un logiciel dont m’a parlé l’étudiante Catherine Charron et qui s’appelle PyCharm. Si vous souhaitez l’essayer, téléchargez la version «Community».

L’interface ressemble à celle de Cloud9. On y trouve également un Terminal auquel on accède en cliquant sur un bouton se trouvant dans le coin inférieur gauche de la fenêtre de PyCharm. Ouvrez un Terminal et vous devriez voir apparaître une nouvelle fenêtre avec l’invite de commande «$».

Fichiers de travail

Mais auparavant, pour faire certains des exercices du tutoriel ci-dessous, veuillez télécharger le fichier compressé que j’ai préalablement préparé ici. Décompressez-le et téléversez (Menu File > Upload Local Files…) l’ensemble sur votre ordi.

Si vous utilisez PyCharm, trouvez un répertoire appelé PyCharmProjects et mettez-y les fichiers en prenant soin de conserver la structure des dossiers.

Si vous utilisez Cloud9, choisissez File > Upload Local Files….

Votre espace de travail Cloud9 devrait ainsi ressembler à ceci:

Voilà! On est prêt.e.s!


whoami

Qui suis-je? Sur Cloud9, on s’appelle tous ec2-user (le nom du service Elastic Compute Cloud d’AWS). Mais sur votre ordinateur à vous et sur PyCharm, la commande whoami affiche le nom du compte.

jhroy:~/environment $ whoami
ec2-user

pwd

Où suis-je? La commande pwd permet simplement d’afficher le chemin («path») à partir de la racine («root») du répertoire dans lequel vous vous trouvez en ce moment.

jhroy:~/environment $ pwd
/home/ec2-user/environment

Sur ma machine:

JulesWinnfield:~ jhr$ pwd
/Users/jean-huguesroy

<flèche vers le haut>

Vous avez peut-être remarqué que mes commandes apparaissent très rapidement. Pour faire réapparaître la commande que vous venez tout juste d’exécuter, ou une commande que vous avez entrée dans le passé (il est possible de remonter passablement loin), vous n’avez qu’à appuyer sur le bouton flèche vers le haut de votre clavier.

<ctrl-z>

Pour interrompre une commande qui prendrait trop de temps, vous pouvez taper ctrl-z afin de vous retrouver à l’invite de commande.

cd

La commande cd, qui signifie change directory, peut sembler ridicule, mais avant l’invention de la souris et des fenêtres, c’était la façon de naviguer dans les différents répertoires se trouvant sur un ordinateur.

Il vous suffit donc de taper cd suivi du nom du répertoire dans lequel vous voulez entrer.

jhroy:~/environment $ cd matosunix
jhroy:~/environment/matosunix $

Pour revenir en arrière et remonter d’un niveau, il faut ajouter deux points après cd :

jhroy:~/environment/matosunix $ cd ..
jhroy:~/environment $

Si on veut éviter d’entrer plusieurs fois la commande cd, on peut aussi indiquer un chemin plus complet si on le connaît :

jhroy:~/environment $ cd matosunix/canada/quebec
jhroy:~/environment/matosunix/canada/quebec

Et dans ce cas-ci, on pourrait revenir au répertoire workspace en entrant deux fois les deux points, séparés par une barre oblique.

jhroy:~/environment/matosunix/canada/quebec $ cd ../../..
jhroy:~/environment $

On peut même effectuer un aller-retour dans la même commande. Ci-dessous, on passe directement du répertoire canada/quebec au répertoire saq en passant par le répertoire «parent» (environment) :

jhroy:~/environment/matosunix/canada/quebec $ cd ../../saq
jhroy:~/environment/matosunix/saq $

Sur un ordinateur Mac, il est possible d’éviter de devoir taper plusieurs commandes cd en faisant un ctrl-clic sur le répertoire dans lequel vous voulez vous rendre et en choisissant le menu Services > Nouveau terminal au dossier. Une nouvelle fenêtre de terminal s’ouvre alors et vous vous retrouvez dans le répertoire en question.

ls

La commande ls permet d’afficher le contenu du répertoire dans lequel vous vous trouvez. Par défaut, le contenu s’affiche par colonnes et dans l’ordre alphabétique.

JulesWinnfield:facebook jhr$ ls
posts-1047fm.Outaouais.csv
posts-919sport.csv
posts-985fm.csv
posts-BLVD1021.csv
posts-CBCMontreal.csv
posts-CIHOFM.csv
posts-EchosVedettes.csv
posts-EstriePlus.csv
posts-HollywoodPQ.csv
posts-HuffPostQuebec.csv
posts-Infopresse.csv
posts-JdeQuebec.csv
[...]

On peut cependant ajouter des options aux commandes Unix.

Ainsi, ajouter -l à ls permet d’effectuer un affichage détaillé du contenu de votre répertoire.

JulesWinnfield:facebook jhr$ ls -l
total 52936
-rw-r--r-- 1 jhr staff 287215 22 jan 21:38 posts-1047fm.Outaouais.csv
-rw-r--r-- 1 jhr staff 168224 22 jan 21:12 posts-919sport.csv
-rw-r--r-- 1 jhr staff 273232 22 jan 21:54 posts-985fm.csv
-rw-r--r-- 1 jhr staff 170163 22 jan 21:37 posts-BLVD1021.csv
-rw-r--r-- 1 jhr staff 260119 22 jan 22:03 posts-CBCMontreal.csv
-rw-r--r-- 1 jhr staff 328870 22 jan 21:28 posts-CIHOFM.csv
-rw-r--r-- 1 jhr staff 238716 22 jan 21:24 posts-EchosVedettes.csv
-rw-r--r-- 1 jhr staff 356558 22 jan 21:18 posts-EstriePlus.csv
-rw-r--r-- 1 jhr staff 275111 22 jan 21:41 posts-HollywoodPQ.csv
-rw-r--r-- 1 jhr staff 169045 22 jan 21:58 posts-HuffPostQuebec.csv
-rw-r--r-- 1 jhr staff 260909 22 jan 21:27 posts-Infopresse.csv
-rw-r--r-- 1 jhr staff 301876 22 jan 22:04 posts-JdeQuebec.csv
[...]

Il y a une multitude d’options disponibles pour la commande ls. Vous pourriez souhaiter ordonner les fichiers en fonction de leur taille en octets, par exemple. C’est l’option -S qui permettrait de le faire (et la casse [majuscule ou minuscule] est importante dans ces options).

On peut aussi combiner les options. Si on ajoute -S et -l à la commande ls, on a un affichage détaillé ordonné en fonction de la taille des documents.

JulesWinnfield:canada jhr$ ls -l -S
total 1048
-rw-r-----@ 1 jhr staff 167756 15 sep 2016 ontario.txt
-rw-r-----@ 1 jhr staff 123409 15 sep 2016 quebec.txt
-rw-r-----@ 1 jhr staff 62608 15 sep 2016 cb.txt
-rw-r-----@ 1 jhr staff 50818 15 sep 2016 alberta.txt
-rw-r-----@ 1 jhr staff 35325 15 sep 2016 sask.txt
-rw-r-----@ 1 jhr staff 19336 15 sep 2016 manitoba.txt
-rw-r-----@ 1 jhr staff 16123 15 sep 2016 ns.txt
-rw-r-----@ 1 jhr staff 12790 15 sep 2016 nb.txt
-rw-r-----@ 1 jhr staff 9570 15 sep 2016 terre-neuve.txt
-rw-r-----@ 1 jhr staff 5805 15 sep 2016 ipe.txt
-rw-r-----@ 1 jhr staff 2433 15 sep 2016 tno.txt
-rw-r-----@ 1 jhr staff 2427 15 sep 2016 yukon.txt
-rw-r-----@ 1 jhr staff 2205 15 sep 2016 nunavut.txt
drwxr-xr-x 4 jhr staff 136 23 jan 20:07 cb
drwxr-xr-x 4 jhr staff 136 23 jan 20:07 manitoba
drwxr-xr-x 3 jhr staff 102 15 sep 2016 alberta
drwxr-xr-x 3 jhr staff 102 14 sep 2016 ipe
drwxr-xr-x 3 jhr staff 102 14 sep 2016 nb
drwxr-xr-x 3 jhr staff 102 14 sep 2016 ns
drwxr-xr-x 3 jhr staff 102 14 sep 2016 nunavut
drwxr-xr-x 3 jhr staff 102 14 sep 2016 ontario
drwxr-xr-x 3 jhr staff 102 14 sep 2016 quebec
drwxr-xr-x 3 jhr staff 102 14 sep 2016 sask
drwxr-xr-x 3 jhr staff 102 14 sep 2016 terre-neuve
drwxr-xr-x 3 jhr staff 102 14 sep 2016 tno
drwxr-xr-x 3 jhr staff 102 14 sep 2016 yukon

Notez qu’on peut aussi coller les options lorsqu’on en utilise plusieurs. Ainsi, au lieu d’écrire -l -S, on peut écrire -lS ou -Sl.

JulesWinnfield:canada jhr$ ls -Sl
total 1048
-rw-r-----@ 1 jhr staff 167756 15 sep 2016 ontario.txt
-rw-r-----@ 1 jhr staff 123409 15 sep 2016 quebec.txt
-rw-r-----@ 1 jhr staff 62608 15 sep 2016 cb.txt
-rw-r-----@ 1 jhr staff 50818 15 sep 2016 alberta.txt
-rw-r-----@ 1 jhr staff 35325 15 sep 2016 sask.txt
-rw-r-----@ 1 jhr staff 19336 15 sep 2016 manitoba.txt
[...]

man

Pour en savoir plus sur une commande donnée, lisez-en le manuel en invoquant la commande man. Pour connaître toutes les options de la commande ls, par exemple, vous tapez man ls. C’est malheureusement affiché en anglais. Il faut aller sur le web pour trouver des versions françaises de ces manuels.

jeanhuguesroy:~/workspace $ man ls
LS(1) User Commands LS(1)
NAME
ls — list directory contents
SYNOPSIS
ls [OPTION]… [FILE]…
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabeti‐
cally if none of -cftuvSUX nor — sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .
-A, --almost-all
do not list implied . and ..
--author
with -l, print the author of each file
-b, --escape
print C-style escapes for nongraphic characters
--block-size=SIZE
scale sizes by SIZE before printing them. E.g., ‘ — block-size=M’ prints sizes in units
of 1,048,576 bytes. See SIZE format below.
-B, --ignore-backups
do not list implied entries ending with ~
[...]

L’option -h (pour help) ou encore , peut également être utilisée avec certaines commandes pour faire afficher une version abrégée du manuel.

mkdir

On peut créer, au besoin, des répertoires avec la commande mkdir (make directory).

jhroy:~/environment/matosunix/canada/quebec $ mkdir abitibi
jhroy:~/environment/matosunix/canada/quebec $ ls
abitibi migrations.csv

On peut créer plusieurs répertoires en enchaînant tout simplement leurs noms séparés d’un espace.

jhroy:~/environment/matosunix/canada/quebec $ mkdir saguenay cote-nord gaspesie
jhroy:~/environment/matosunix/canada/quebec $ ls
abitibi cote-nord gaspesie migrations.csv saguenay

rmdir

Pour détruire un répertoire, c’est la commande rmdir (remove directory)

jhroy:~/environment/matosunix/canada/quebec $ rmdir cote-nord
jhroy:~/environment/matosunix/canada/quebec $ ls
abitibi gaspesie migrations.csv saguenay

rm

Je vous parle de rmdir, petite sœur de la commande rm (remove), parce qu’il faut faire très attention avec cette commande et ne l’utiliser qu’avec parcimonie. En fait, ne l’utilisez jamais. Je vous la mentionne pour que vous la connaissiez et la fuyiez comme la peste. Entrer la commande ci-dessous, par exemple, efface tout votre disque dur sans même vous demander auparavant si vous souhaitez réellement faire ça. Pas de yes, no, cancel. Pas de undo non plus. C’est irrémédiable.

rm -rf /

Attention, donc, si vous tombez sur une page web qui vous propose d’entrer une commande comme ça. Quelques autres commandes mortelles à éviter absolument sont décrites dans la page suivante du site Howtogeek :

cat

Non, ce n’est pas une commande qui fait miauler votre ordi. Elle vient du mot concaténation. Elle permet d’interagir avec des fichiers texte. Elle est surtout utile pour joindre plusieurs fichiers en un seul. Il suffit d’écrire le nom de tous les fichiers qu’on souhaite réunir et, après le caractère >, d’inscrire le nom du nouveau fichier qui naîtra de la réunion qu’on souhaite effectuer.

Voici un exemple avec les fichiers se trouvant dans le répertoire huffpost.

jhroy:~/environment/matosunix/huffpost $ ls
hp-au.csv hp-ca.csv hp-es.csv hp-gr.csv
hp-it.csv hp-kr.csv hp-mx.csv hp-uk.csv
hp-br.csv hp-de.csv hp-fr.csv hp-in.csv
hp-jp.csv hp-mg.csv hp-qc.csv hp-us.csv
jhroy:~/environment/matosunix/huffpost $ cat hp-au.csv hp-ca.csv hp-es.csv hp-gr.csv hp-it.csv hp-kr.csv hp-mx.csv hp-uk.csv hp-br.csv hp-de.csv hp-fr.csv hp-in.csv hp-jp.csv hp-mg.csv hp-qc.csv hp-us.csv > hp-toute.csv
jhroy:~/environment/matosunix/huffpost $ ls -l
total 1376888
-rw-r--r-- 1 ec2-user ec2-user 6896624 Jan 24 02:29 hp-au.csv
-rw-r--r-- 1 ec2-user ec2-user 9108334 Jan 24 02:29 hp-br.csv
-rw-r--r-- 1 ec2-user ec2-user 87558203 Jan 24 02:30 hp-ca.csv
-rw-r--r-- 1 ec2-user ec2-user 21777526 Jan 24 02:29 hp-de.csv
-rw-r--r-- 1 ec2-user ec2-user 18421992 Jan 24 02:29 hp-es.csv
-rw-r--r-- 1 ec2-user ec2-user 23236269 Jan 24 02:29 hp-fr.csv
-rw-r--r-- 1 ec2-user ec2-user 35859009 Jan 24 02:29 hp-gr.csv
-rw-r--r-- 1 ec2-user ec2-user 5668787 Jan 24 02:29 hp-in.csv
-rw-r--r-- 1 ec2-user ec2-user 29705026 Jan 24 02:29 hp-it.csv
-rw-r--r-- 1 ec2-user ec2-user 10500970 Jan 24 02:29 hp-jp.csv
-rw-r--r-- 1 ec2-user ec2-user 17490925 Jan 24 02:29 hp-kr.csv
-rw-r--r-- 1 ec2-user ec2-user 12444390 Jan 24 02:29 hp-mg.csv
-rw-r--r-- 1 ec2-user ec2-user 864149 Jan 24 02:29 hp-mx.csv
-rw-r--r-- 1 ec2-user ec2-user 116250860 Jan 24 02:30 hp-qc.csv
-rw-rw-r-- 1 ec2-user ec2-user 704942127 Jan 24 03:44 hp-toute.csv
-rw-r--r-- 1 ec2-user ec2-user 74486641 Jan 24 02:30 hp-uk.csv
-rw-r--r-- 1 ec2-user ec2-user 234672422 Jan 24 02:31 hp-us.csv

On voit que le nouveau fichier, qu’on a baptisé hp-toute.csv, fait près de 705Mo, ce qui correspond à la somme de la taille en octets des huit autres fichiers. Réunir huit grands fichiers comme on vient de le faire serait très difficile avec un tableur comme Excel ou Calc.

head et tail

Les commandes head et tail sont très pratiques pour avoir une idée de ce que contient un très gros fichier que les logiciels habituels (notre traitement de texte ou notre tableur, par exemple) seraient incapables d’ouvrir. Par défaut, head affiche les 10 premières lignes du fichier, tail les 10 dernières.

Dans l’exemple ci-dessous, il semble que le fichier migrations.csv qui se trouve dans le sous-répertoire alberta du répertoire canada contienne des données sur les migrations interprovinciales depuis 1971. Ainsi, assez rapidement, on comprend que 10886 personnes ont migré de l’Alberta vers l’Ontario en 1971, par exemple.

jeanhuguesroy:~/workspace/canada/alberta $ head migrations.csv
Ann?e,Province d'origine,Province de destination,Vecteur,Coordonn?e,Valeur
1971,Alberta,Ontario,v466664,9.6,10886
1972,Alberta,Ontario,v466664,9.6,9554
1973,Alberta,Ontario,v466664,9.6,11794
1974,Alberta,Ontario,v466664,9.6,8695
1975,Alberta,Ontario,v466664,9.6,9526
1976,Alberta,Ontario,v466664,9.6,9543
1977,Alberta,Ontario,v466664,9.6,11286
1978,Alberta,Ontario,v466664,9.6,11307
1979,Alberta,Ontario,v466664,9.6,10958

L’option la plus utile avec head ou tail est -n. Elle vous permet de changer le nombre de lignes que vous faites afficher si vous avez besoin d’en voir plus (ou moins) que 10.

jeanhuguesroy:~/workspace/canada/alberta $ tail -n 5 migrations.csv
2010,Alberta,"Nunavut, province de destination",v466659,9.17,76
2011,Alberta,"Nunavut, province de destination",v466659,9.17,62
2012,Alberta,"Nunavut, province de destination",v466659,9.17,59
2013,Alberta,"Nunavut, province de destination",v466659,9.17,53
2014,Alberta,"Nunavut, province de destination",v466659,9.17,110

wc

Pas de blagues, désolé: cette commande signifie simplement word count. Par défaut, elle vous donne trois choses: le nombre de lignes, de mots et d’octets dans un fichier donné.

JulesWinnfield:canada jhr$ wc quebec.txt
434 6839 123409 quebec.txt

Si on veut le nombre de caractères que contient le fichier, il faut invoquer l’option -m.

JulesWinnfield:canada jhr$ wc -m quebec.txt
122337 quebec.txt

Si on veut seulement afficher le nombre de lignes, c’est l’option -l; uniquement le nombre de mots, c’est l’option -w et si on ne veut que le nombre d’octets, c’est l’option -c.

JulesWinnfield:canada jhr$ wc -l quebec.txt
434 quebec.txt
JulesWinnfield:canada jhr$ wc -w quebec.txt
6839 quebec.txt
JulesWinnfield:canada jhr$ wc -c quebec.txt
123409 quebec.txt

Si on souhaitait que wc nous donne des informations sur les 10 fichiers contenus dans le répertoire canada, on pourrait répéter l’opération 10 fois. Ce serait fastidieux.

Heureusement, on peut procéder plus rapidement grâce au caractère de substitution qu’est l’astérisque. Cela permet d’effectuer la recherche dans tous les fichiers de notre répertoire se terminant par .txt (et on en profite pour combiner les options offertes par wc, qui nous calcule des totaux par-dessus le marché).

JulesWinnfield:facebook jhr$ wc *.csv
2966 5932 287215 posts-1047fm.Outaouais.csv
1848 3696 168224 posts-919sport.csv
3061 6122 273232 posts-985fm.csv
1903 3806 170163 posts-BLVD1021.csv
2970 5940 260119 posts-CBCMontreal.csv
3141 12564 328870 posts-CIHOFM.csv
2399 7197 238716 posts-EchosVedettes.csv
3122 12488 356558 posts-EstriePlus.csv
3038 3038 275111 posts-HollywoodPQ.csv
1760 3520 169045 posts-HuffPostQuebec.csv
[...]
979 1958 99750 posts-radiocanada.science.csv
2738 5476 271054 posts-radiocanada.sports.csv
2958 14790 298805 posts-radioxquebec.csv
96 96 7767 posts-radpointca.csv
2244 4488 207585 posts-rdieconomie.csv
3131 6262 307006 posts-tvaestduquebec.csv
3085 6170 305376 posts-tvagatineauottawa.csv
3053 6106 278187 posts-tvaquebec.csv
2988 5976 297030 posts-tvatroisrivieres.csv
1294 2588 121823 posts-vicequebec.csv
284249 710682 26899535 total

grep

On arrive dans les commandes plus hardcore. Toujours dans le cas où vous tombez sur des fichiers trop énormes pour être ouverts facilement par les suites bureautiques habituelles, la commande grep vous permet d’y faire des recherches sans heurts.

Son nom vient de cette phrase en anglais : globally search a regular expression and print it. Il suffit dont d’indiquer quelle est l’expression qu’on cherche et grep nous retourne toutes les lignes où cette expression est présente dans notre fichier.

On va se rendre dans le répertoire saq pour demander à grep, par exemple, de retrouver toutes les occurrences de la chaîne «Laval» dans le fichier succursales.csv (je ne reproduis pas tout, car ce serait trop long):

JulesWinnfield:saq jhr$ grep Laval succursales.csv
23049,Saint-Martin Ouest/Le Corbusier,SAQ Express,"1845, boul. Saint-Martin Ouest",Laval,H7S1N2,45.5667,-73.7302
23121,Duvernay,SAQ,"3100, boul. de la Concorde Est - Centre commercial Duvernay (Local 50 A)",Laval,H7E2B8,45.5925,-73.6669
23133,Sainte-Dorothée,SAQ Sélection,"1096, autoroute Chomedey Ouest ( 13 )",Laval,H7X4C9,45.5319,-73.7856
23139,Centre Laval,SAQ,"1600, boul. Le Corbusier - Local # 122 - Centre Laval",Laval,H7S1Y9,45.5628,-73.73
23168,Chomedey,SAQ Sélection,"555, boul. Curé-Labelle",Laval,H7V2T4,45.5375,-73.7398
23181,Fabreville,SAQ,"420, boul. Curé-Labelle",Laval,H7P2P1,45.5771,-73.7875
[...]

Et si on ne souhaite pas afficher tout le contenu des lignes? On veut simplement avoir le nombre de lignes dans lesquelles le texte qu’on cherche se retrouve. C’est possible avec l’option -c (pour count). Ainsi, il y a 19 lignes dans lesquelles on retrouve «Laval» dans le fichier succursales.csv.

JulesWinnfield:saq jhr$ grep Laval -c succursales.csv
19

Comme avec wc, on peut se servir de l’astérisque pour effectuer la recherche dans tous les fichiers d’un répertoire donné se terminant par .csv. Ainsi, si on se déplace dans le répertoire huffpost, par exemple, on peut rechercher le nombre de fois que toutes les éditions du HuffPost ont écrit des articles mentionnant Xavier Dolan dans le titre ou les tags.

jeanhuguesroy:~/workspace/panamapapers $ grep -c Montreal *.csv 
Addresses.csv:68
Entities.csv:23
Intermediaries.csv:0
Officers.csv:0
all_edges.csv:0

Si on souhaite rechercher dans TOUS les fichiers du répertoire dans lequel on se trouve, peu importe leur extension, on se sert de l’option -r. Elle permet de faire une recherche récursive qui fouille dans tous les fichiers. Dans ce cas-ci, on peut l’utiliser pour remplacer l’expression *.csv dans notre commande grep, puisqu’on n’a que des fichiers csv dans notre répertoire.

JulesWinnfield:huffpost jhr$ grep -c "Xavier Dolan" *.csv
hp-au.csv:0
hp-br.csv:1
hp-ca.csv:29
hp-de.csv:0
hp-es.csv:2
hp-fr.csv:40
hp-gr.csv:8
hp-in.csv:0
hp-it.csv:2
hp-jp.csv:0
hp-kr.csv:0
hp-mg.csv:3
hp-mx.csv:0
hp-qc.csv:305
hp-uk.csv:1
hp-us.csv:5

Il faut cependant savoir que grep est sensible à la casse. Ainsi, si on souhaite rechercher le nombre de fois où l’expression «Québec» avec toutes les graphies possibles («Quebec», «quebecois», etc.), il faut utiliser l’option -i, qui rend la recherche insensible à la casse :

JulesWinnfield:huffpost jhr$ grep -ci quebec *.csv
hp-au.csv:4
hp-br.csv:2
hp-ca.csv:6247
hp-de.csv:4
hp-es.csv:17
hp-fr.csv:50
hp-gr.csv:0
hp-in.csv:0
hp-it.csv:7
hp-jp.csv:1
hp-kr.csv:0
hp-mg.csv:72
hp-mx.csv:0
hp-qc.csv:392179
hp-uk.csv:40
hp-us.csv:87

Il peut arriver qu’on souhaite identifier les lignes où une chaîne de caractères donnée ne se trouve pas. On utilise alors l’option -v. Combinée avec l’option -c, elle permet de voir dans combien de titres ou de tags d’articles l’expression «quebec» ne se retrouve pas dans chacune des éditions du HuffPost.

JulesWinnfield:huffpost jhr$ grep -civ quebec *.csv
hp-au.csv:18202
hp-br.csv:21031
hp-ca.csv:261693
hp-de.csv:71737
hp-es.csv:57188
hp-fr.csv:55356
hp-gr.csv:77433
hp-in.csv:14918
hp-it.csv:65127
hp-jp.csv:23908
hp-kr.csv:53845
hp-mg.csv:31107
hp-mx.csv:2188
hp-qc.csv:48
hp-uk.csv:1014539
hp-us.csv:619450

Maintenant, vous vous souvenez que les deux lettres du centre dans grep signifient «regular expression», ou regex. Mais qu’est-ce que ça mange en hiver, une regex?

D’abord, on retrouve différentes traductions de regular expression en français. Termium propose «expression normale». Le Grand dictionnaire terminologique suggère plutôt «expression rationnelle». Évitez «expression régulière».

Pour reprendre la définition du GDL, une expression rationnelle est un «motif constitué d’une chaîne de caractères spécifiant des conditions à remplir lors d’une recherche effectuée dans un éditeur de texte, et qui correspond à la chaîne recherchée». Ça va devenir clair avec un exemple.

Imaginons que vous souhaitiez chercher, dans un document, toutes les occurrences des années 2010 à aujourd’hui. Vous ne voulez pas faire ressortir les années antérieures. Dans le répertoire canada se trouvent justement des fichiers qui contiennent plusieurs années s’échelonnant de 1971 à 2014. Pour arriver à vos fins, vous effectueriez l’opération suivante:

jeanhuguesroy:~/workspace/canada/quebec $ grep 201[0–9] migrations.csv 
2010,Québec,Terre-Neuve-et-Labrador,147
2011,Québec,Terre-Neuve-et-Labrador,202
2012,Québec,Terre-Neuve-et-Labrador,213
2013,Québec,Terre-Neuve-et-Labrador,223
2014,Québec,Terre-Neuve-et-Labrador,200
2010,Québec,Île-du-Prince-Édouard,122
[...]

Si vous ne souhaitiez faire ressortir que les lignes des années 2013 et 2014, par exemple, vous pourriez entrer l’expression 201[3–4].

Les possibilités sont quasi illimitées. Si vous souhaitiez, par exemple, chercher toutes les lignes du fichier hp-qc.csv contenant des mots de plus de 30 caractères (pour détecter des erreurs, par exemple, ou la fois où le HuffPost Québec a publié quelque chose à propos de la localité de Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch), voici ce qu’il faudrait entrer :

JulesWinnfield:huffpost jhr$ grep "[a-z]\{30,\}" hp-qc.csv
3535961,Québec,2013,7,3,http://quebec.huffingtonpost.ca/2013/07/03/kristen-stewart-fabuleuse-sans-robert-pattinson-au-defile-chanel-photos_n_3535961.html,Kristen Stewart fabuleuse sans Robert Pattinson au défilé Chanel (PHOTOS),Le Huffington Post,?,Le Huffington Post Québec,"Kristen Stewart,célébrités,kristen stewart et robert pattinson,Robert Pattinson Kristen Stewart,kristen stewart chanel,art de vivre,Kristen Stewart paris fashion week,robertpattinsonetkristenstewart,robert pattinson et kristen stewart,Robert Pattinson,Kristen Stewart défilé Chanel,kristen stewart paris,robert pattinson and kristen stewart,pattinson stewart,kristen stewart 2013,défilé Chanel Kristen Stewart",? Le Huffington Post Québec
[...]
8121550,Québec,2015,9,11,http://quebec.huffingtonpost.ca/2015/09/11/meteo-nom-ville_n_8121550.html,Ce présentateur météo a réussi un exploit en direct (VIDÉO),Le Huffington Post,Par Alexis Annaix,Le HuffPost,"météo,insolite,québec vidéo,nom de ville,llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch,liam dutton",Par Alexis Annaix Le HuffPost

Bref, pour en savoir plus sur les expressions rationnelles, l’outil regex101 est parfait pour s’exercer.

curl

La commande cURL permet d’interagir avec des documents sur le web. À la base, elle sert à télécharger. Ainsi, la commande ci-dessous télécharge le code source du site web de l’UQAM et le copie dans un fichier appelé uqam.html.

jhroy:~/environment$ curl uqam.ca > uqam.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 81456 0 81456 0 0 335k 0 — : — : — — : — : — — : — : — 335k

Bien sûr, on pourrait accomplir exactement la même chose à partir de notre logiciel fureteur. À quoi bon se servir de curl, alors? Je l’avoue, cette commande m’a rarement servi. Elle peut cependant être utile si on veut faire des recherches de type grep directement dans des pages web. Un exemple?

La commande ci-dessous combine un curl et un grep à l’aide du caractère appelé pipe en anglais et représenté par une ligne verticale «|». Elle compte le nombre de fois qu’on a parlé de Noël lors de la dernière journée de débats à l’Assemblée nationale en 2017. Le mot a été prononcé 20 fois.

jhroy:~/environment/matosunix/huffpost $ curl -s http://www.assnat.qc.ca/fr/travaux-parlementaires/assemblee-nationale/41-1/journal-debats/20171208/210605.html | grep -c Noël
20

Il est également possible, avec ce truc, de faire des recherches sur plusieurs pages web en même temps. Pour cela, il faut auparavant écrire la liste des URLs qui nous intéressent dans un document texte. Le document assnat.txt contient les 10 pages web de la retranscription des dernières journées de débats à l’Assemblée nationale en 2017.

JulesWinnfield:matosunix jhr$ curl $(<assnat.txt) |  grep Couillard -c
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 438k 100 438k 0 0 438k 0 0:00:01 0:00:01 --:--:-- 388k
100 300k 100 300k 0 0 300k 0 0:00:01 --:--:-- 0:00:01 9040k
100 252k 100 252k 0 0 252k 0 0:00:01 0:00:01 --:--:-- 1124k
100 340k 100 340k 0 0 340k 0 0:00:01 0:00:01 --:--:-- 1484k
100 452k 100 452k 0 0 452k 0 0:00:01 --:--:-- 0:00:01 452k
100 357k 100 357k 0 0 357k 0 0:00:01 --:--:-- 0:00:01 357k
100 428k 100 428k 0 0 428k 0 0:00:01 --:--:-- 0:00:01 428k
100 322k 100 322k 0 0 322k 0 0:00:01 --:--:-- 0:00:01 8038k
100 548k 100 548k 0 0 548k 0 0:00:01 --:--:-- 0:00:01 9680k
100 327k 100 327k 0 0 327k 0 0:00:01 --:--:-- 0:00:01 327k
338

La commande ci dessous dit à curl de lire le fichier assnat2.txt, puis d’aller chercher chacun des fichiers HTML que compte ce fichier, et enfin de compter le nombre d’occurrences de la chaîne de caractères «Couillard» à l’aide de la commande grep -c dans l’ensemble des pages.

Le résultat de la commande affiche un tableau qui nous montre quelques données sur le téléchargement des 10 pages en question et qui, à la toute dernière ligne, nous donne la réponse: l’expression «Couillard» est présente 338 fois dans les 10 documents.

wget

La commande wget est comme un curl sur les stéroïdes. On la présente parfois comme un aspirateur du web. Elle permet plus facilement de télécharger plusieurs documents se trouvant sur une même page, voire l’ensemble d’un site web en entier.

Admettons que vous ayez besoin de télécharger tous les documents PDF de l’enquête du BAPE sur les enjeux liés à l’exploration et l’exploitation du gaz de schiste. Vous pourriez les télécharger un à un, ce qui vous exposerait à la tendinite puisqu’il y a plus de 500 documents!

La commande wget peut vous permettre de les télécharger tous en une seule ligne de code:

jeanhuguesroy:~/workspace/bape/documents $ wget -r -l4 -np -A.pdf http://www.bape.gouv.qc.ca/sections/mandats/gaz_de_schiste-enjeux/

Plusieurs options sont à l’œuvre, ici. L’option -r fait une recherche récursive, plus complète. L’option -l4 demande à wget de descendre de quatre niveaux dans le site web qui nous intéresse (celui de BAPE). L’option -np (no parents)dit que le contenu des répertoires «parents» situés au-dessus de celui qui est précisé dans la commande (http://www.bape.gouv.qc.ca/ sections/mandats/gaz_de_schiste-enjeux/) ne nous intéressent pas. Et l’option -A.pdf dit à wget de ne télécharger que les fichiers se terminant par l’extension .pdf.


Autres commandes pour s’amuser

cal

Vous affiche le calendrier du mois en cours.

jhroy:~/environment $ cal
December 2017
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Vous pouvez voir toute une année en faisant suivre la commande par l’année qui vous intéresse. Ou afficher un mois dans le passé en entrant le numéro du mois suivi de l’année (voici l’affichage tel que le rend mon ordi pour montrer qu’Unix parle aussi français):

JulesWinnfield: jhr$ cal 12 1992
Décembre 1992
Di Lu Ma Me Je Ve Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

say

Ne fonctionne pas sur Cloud9, mais avec un Mac doté de synthèse vocale, cette commande fait en sorte que l’ordinateur énonce, de sa belle voix électronique, ce que vous écrivez.

JHR:~ jhr$ say bonjour... je vous parle... you-hou... on a mis quelqu'un au monde, on devrait peut-être l'écouter. ta di li da di doum.

Et pour vraiment vous amuser, vous pouvez faire lire un fichier txt avec l’option -f (ça ne fonctionne bien qu’avec des fichiers texte) et enregistrer ce que dit l’ordinateur dans un fichier aiff avec l’option -o. Ça me donne presque des idées d’émission de radio!

JHR:~ jhr$ say -f villon.txt -o villon.aiff

Ce tutoriel est partageable à l’aide de l’URL raccourci suivant: http://bit.ly/jhroyunix