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


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. Mais pour les besoins du cours EDM5240, nous allons tous utiliser une interface commune offerte par le service en ligne Cloud9.

Commencez par vous y brancher à votre compte. Lancez un nouvel espace de travail (un «workspace»). Donnez-lui le nom de votre choix et choisissez une instance Python. Agrandissez la fenêtre bleu foncé intitulée «bash - <votre nom>» qui se trouve en bas, à droite. Vous y voyez :

<votre nom>: ~/workspace $

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 maintenant décrire.

Mais auparavant, pour faire certains des exercices 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 dans votre compte Cloud9 en prenant soin de conserver la structure des dossiers.

Votre espace de travail Cloud9 devrait ainsi ressembler à ceci:

Le répertoire «ex50» est créé par défaut par Cloud9. Les quatre autres répertoires sont ceux avec lesquels on va travailler.

whoami

Qui suis-je? Sur Cloud9, on s’appelle tous ubuntu (le nom d’une distribution Linux). Mais sur votre ordinateur à vous, la commande whoami affiche le nom du compte.

jeanhuguesroy:~/workspace $ whoami
ubuntu

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.

jeanhuguesroy:~/workspace $ pwd
/home/ubuntu/workspace

Sur ma machine:

JHR:~ 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.

jeanhuguesroy:~/workspace $ cd canada
jeanhuguesroy:~/workspace/canada $

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

jeanhuguesroy:~/workspace/canada $ cd ..
jeanhuguesroy:~/workspace $

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

jeanhuguesroy:~/workspace $ cd canada/quebec
jeanhuguesroy:~/workspace/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.

jeanhuguesroy:~/workspace/canada/quebec $ cd ../..
jeanhuguesroy:~/workspace $

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

jeanhuguesroy:~/workspace/france $ cd ../canada
jeanhuguesroy:~/workspace/canada $

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.

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.

jeanhuguesroy:~/workspace $ ls -l
total 16
-rw-r — r — 1 ubuntu ubuntu 1556 Aug 11 05:29 README.md
drwxr-xr-x 16 ubuntu ubuntu 4096 Aug 14 12:08 canada/
drwxr-xr-x 10 ubuntu ubuntu 4096 Aug 11 05:50 ex50/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 france/
jeanhuguesroy:~/workspace $

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 majuscule 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.

jeanhuguesroy:~/workspace/canada $ ls -l -S
total 576
-rw-r--r-- 1 ubuntu ubuntu 167756 Aug 14 12:00 ontario.txt
-rw-r--r-- 1 ubuntu ubuntu 123409 Aug 14 12:00 quebec.txt
-rw-r--r-- 1 ubuntu ubuntu 62608 Aug 14 12:00 cb.txt
-rw-r--r-- 1 ubuntu ubuntu 50818 Aug 14 12:00 alberta.txt
-rw-r--r-- 1 ubuntu ubuntu 35325 Aug 14 12:00 sask.txt
-rw-r--r-- 1 ubuntu ubuntu 19336 Aug 14 12:00 manitoba.txt
-rw-r--r-- 1 ubuntu ubuntu 16123 Aug 14 12:00 ns.txt
-rw-r--r-- 1 ubuntu ubuntu 12790 Aug 14 12:00 nb.txt
-rw-r--r-- 1 ubuntu ubuntu 9570 Aug 14 12:00 terre-neuve.txt
-rw-r--r-- 1 ubuntu ubuntu 5805 Aug 14 12:00 ipe.txt
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 alberta/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 cb/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 ipe/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 manitoba/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 nb/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 ns/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 nunavut/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 ontario/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 quebec/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 sask/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 terre-neuve/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 tno/
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 14 12:00 yukon/
-rw-r--r-- 1 ubuntu ubuntu 2433 Aug 14 12:00 tno.txt
-rw-r--r-- 1 ubuntu ubuntu 2427 Aug 14 12:00 yukon.txt
-rw-r--r-- 1 ubuntu ubuntu 2205 Aug 14 12:00 nunavut.txt

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.

jeanhuguesroy:~/workspace/canada $ ls -Sl
total 576
-rw-r — r — 1 ubuntu ubuntu 167756 Sep 15 12:00 ontario.txt
-rw-r — r — 1 ubuntu ubuntu 123409 Sep 15 12:00 quebec.txt
-rw-r — r — 1 ubuntu ubuntu 62608 Sep 15 12:00 cb.txt
-rw-r — r — 1 ubuntu ubuntu 50818 Sep 15 12:00 alberta.txt
[...]
jeanhuguesroy:~/workspace/canada $ ls -lS
total 576
-rw-r — r — 1 ubuntu ubuntu 167756 Sep 15 12:00 ontario.txt
-rw-r — r — 1 ubuntu ubuntu 123409 Sep 15 12:00 quebec.txt
-rw-r — r — 1 ubuntu ubuntu 62608 Sep 15 12:00 cb.txt
-rw-r — r — 1 ubuntu ubuntu 50818 Sep 15 12:00 alberta.txt
[...]

Hé! Mais que se passe-t-il? On n’avait pas tous ces fichiers tout à l’heure? C’est que j’ai utilisé une autre commande pour entrer dans le répertoire canada.

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).

jeanhuguesroy:~/workspace $ mkdir rhone-alpes
jeanhuguesroy:~/workspace $ ls
README.md canada/ ex50/ france/ rhone-alpes/

rmdir

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

jeanhuguesroy:~/workspace $ rmdir rhone-alpes
jeanhuguesroy:~/workspace $ ls
README.md canada/ ex50/ france/

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 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 france.

jeanhuguesroy:~/workspace/france $ ls
caracteristiques_2015.csv lieux_2015.csv usagers_2015.csv vehicules_2015.csv
jeanhuguesroy:~/workspace/france $ cat caracteristiques_2015.csv lieux_2015.csv vehicules_2015.csv usagers_2015.csv > accidents_route_2015.csv
jeanhuguesroy:~/workspace/france $ ls -l
total 32352
-rw-r--r-- 1 ubuntu ubuntu 16560054 Aug 14 18:29 accidents_route_2015.csv
-rw-r--r-- 1 ubuntu ubuntu 4369670 Aug 14 12:00 caracteristiques_2015.csv
-rw-r--r-- 1 ubuntu ubuntu 3051759 Aug 14 12:00 lieux_2015.csv
-rw-r--r-- 1 ubuntu ubuntu 5447072 Aug 14 12:00 usagers_2015.csv
-rw-r--r-- 1 ubuntu ubuntu 3691553 Aug 14 12:00 vehicules_2015.csv

On voit que le nouveau fichier, qu’on a baptisé accidents_route_2015.csv, fait près de 16,6 Mo, ce qui correspond à la somme de la taille en octets des quatre autres fichiers.

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
Annee,Origine,Destination,Nombre
1971,Alberta,Ontario,10886
1972,Alberta,Ontario,9554
1973,Alberta,Ontario,11794
1974,Alberta,Ontario,8695
1975,Alberta,Ontario,9526
1976,Alberta,Ontario,9543
1977,Alberta,Ontario,11286
1978,Alberta,Ontario,11307
1979,Alberta,Ontario,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 $ head -n 5 migrations.csv
Annee,Origine,Destination,Nombre
1971,Alberta,Ontario,10886
1972,Alberta,Ontario,9554
1973,Alberta,Ontario,11794
1974,Alberta,Ontario,8695

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é.

jeanhuguesroy:~/workspace/canada $ 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.


jeanhuguesroy:~/workspace/canada $ 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.

jeanhuguesroy:~/workspace/canada $ wc -l quebec.txt
434 quebec.txt
jeanhuguesroy:~/workspace/canada $ wc -w quebec.txt
6839 quebec.txt
jeanhuguesroy:~/workspace/canada $ 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é).

jeanhuguesroy:~/workspace/canada $ wc -lwmc *.txt
175 3247 50709 50818 alberta.txt
203 3749 62485 62608 cb.txt
21 396 5785 5805 ipe.txt
63 1157 19291 19336 manitoba.txt
43 786 12749 12790 nb.txt
56 994 16084 16123 ns.txt
7 158 2193 2205 nunavut.txt
580 10154 167403 167756 ontario.txt
434 6839 122337 123409 quebec.txt
115 2076 35241 35325 sask.txt
31 636 9546 9570 terre-neuve.txt
6 169 2421 2433 tno.txt
7 178 2415 2427 yukon.txt
1741 30539 508659 510605 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 des Panama Papers pour demander à grep, par exemple, de retrouver toutes les occurrences de la chaîne «Montréal» dans le fichier Entities.csv (je ne reproduis pas tout, car ce serait trop long):

jeanhuguesroy:~/workspace/panamapapers $ grep Montreal Entities.csv
IMF Network,,,XXX,Undetermined,,”IMF Network 5775 Cavendish Blvd. Suite 122 Montreal, Quebec H4W 2X8 Canada RT BVI”,,01-JAN-1980,,,,,Commonwealth Trust Limited,,CAN,Canada,,The Offshore Leaks data is current through 2010,179216,Offshore Leaks
Montreal Asset Management Pte Ltd,,,BVI,British Virgin Islands,Standard International Company,28 Harvey Crescent Singapore 489390,,13-NOV-2007,,,,Active,Portcullis Trustnet,1443460,SGP;VGB,”Singapore;Virgin Islands, British”,,The Offshore Leaks data is current through 2010,164702,Offshore Leaks
[...]

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 23 lignes dans lesquelles on retrouve «Montréal» dans le fichier Entities.csv.

jeanhuguesroy:~/workspace/panamapapers $ grep -c Montreal Entities.csv 
23

Comme avec wc, on peut se servir de l’astérisque pour effectuer la recherche dans tous les fichiers de notre répertoire se terminant par .csv.

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.

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

Il faut cependant savoir que grep est sensible à la casse. Ainsi, la recherche qu’on vient de faire ne nous indique que le nombre de fois où l’expression «Montreal» (avec un «M» majuscule et tout le reste en minuscule) a été comptée. Si on veut tenir compte d’autres graphies possibles («MONTREAL», «montreal», etc.), il faut utiliser l’option -i, qui rend la rechercher insensible à la casse. Tiens, donc! On trouve plus d’occurrences :

jeanhuguesroy:~/workspace/panamapapers $ grep -icr montreal
Addresses.csv:107
Intermediaries.csv:11
Entities.csv:124
Officers.csv:0
all_edges.csv:0

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 que, dans le fichier Addresses.csv, il y a 149 768 lignes dans lesquelles le mot «Canada» ne se retrouve pas.

jeanhuguesroy:~/workspace/panamapapers $ grep -icrv Canada
Addresses.csv:149768
Intermediaries.csv:23388
Entities.csv:318408
all_edges.csv:1265691
Officers.csv:344173

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 expressions alphanumériques (des mots ou des chiffres) de plus de 30 caractères, voici ce qu’il faudrait entrer :

jeanhuguesroy:~/workspace/panamapapers $ grep -riw “[[:alnum:]]\{30,\}”
Addresses.csv:”Dongguanshifuguanwujinyouxiangong Si, Humen County, Dongguan Guangdong, China”,,The Offshore Leaks data is current through 2010,CHN,China,264470,Offshore Leaks
[...]
Addresses.csv:11 Quai du 4 Septembre F 92100 Boulogne - Billancourt France,9F3BADBF5AB4FAF77A6C850F7EA57849,The Panama Papers data is current through 2015,FRA,France,14002172,Panama Papers
Addresses.csv:11 QUEENSQAY HOUSE ST. HELIER; JERSEY; C.I.,4A286C9849BEC81C8DD300AB158D794C,The Panama Papers data is current through 2015,JEY,Jersey,14002173,Panama Papers
[...]

Dans l’exemple ci-dessus, j’ai ajouté l’option -w (words) qui restreint la recherche à des mots. L’expression [[:alnum:]] demande tout caractère alphanumérique. L’expression \{30,\} demande 30 occurrences ou plus du caractère demandé juste avant.

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.

jeanhuguesroy:~/workspace $ 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 d’occurrences des années 2000 à 2029 sur une page du journal des débats de l’Assemblée nationale. Il y en a eu 46.

jeanhuguesroy:~/workspace/numeris $ curl -s http://www.assnat.qc.ca/fr/travaux-parlementaires/assemblee-nationale/41-1/journal-debats/20160610/174627.html | grep 20[0–2][0–9] -c
46

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 186 pages web de la retranscription des débats à l’Assemblée nationale depuis l’élection du gouvernement libéral actuel. On va se servir de assnat2.txt qui n’en contient que 10 pour que l’exemple fonctionne plus rapidement.

jeanhuguesroy:~/workspace/assnat $ curl $(<assnat2.txt) | grep Couillard -c
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 546k 100 546k 0 0 247k 0 0:00:02 0:00:02 — : — : — 247k
100 494k 100 494k 0 0 314k 0 0:00:01 0:00:01 — : — : — 862k
100 575k 100 575k 0 0 250k 0 0:00:02 0:00:02 — : — : — 445k
100 523k 100 523k 0 0 242k 0 0:00:02 0:00:02 — : — : — 453k
100 606k 100 606k 0 0 297k 0 0:00:02 0:00:02 — : — : — 583k
100 153k 100 153k 0 0 95784 0 0:00:01 0:00:01 — : — : — 240k
100 150k 100 150k 0 0 141k 0 0:00:01 0:00:01 — : — : — 2587k
100 373k 100 373k 0 0 245k 0 0:00:01 0:00:01 — : — : — 715k
100 433k 100 433k 0 0 248k 0 0:00:01 0:00:01 — : — : — 582k
100 535k 100 535k 0 0 334k 0 0:00:01 0:00:01 — : — : — 890k
244

La commande ci dessous dit à curl de lire le fichier assnat2.txt, puis de compter le nombre d’occurrences de la chaîne de caractères «Couillard» à l’aide de la commande grep -c.

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 244 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.

jeanhuguesroy:~/workspace/ $ cal
August 2016
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):

JHR:~ 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 commission-charbonneau.txt -o commission1.aiff