1. Un aperçu du shell Unix đ”#
Un shell est un programme qui attend un ordre de la part de lâutilisateur, exĂ©cute cet ordre, affiche le rĂ©sultat puis attend Ă nouveau un ordre. En anglais on parle de REPL pour Read Execute Print Loop. Il existe plusieurs shells : Bash, csh, zsh⊠Ici on ne parlera que du shell Bash qui est le plus utilisĂ©. Cela dit, toutes les commandes prĂ©sentĂ©es ici sont communes Ă tous les shells Unix.
Lorsquâon donne des ordres Ă un shell, on utilise ni menu, ni bouton, ni case Ă cocher. Tous les ordres sont Ă©crits au shell.
Le shell fonctionne sur un ordinateur, qui nâa aucune capacitĂ© dâabstraction ni dâintuition. Pour que les ordres donnĂ©s au shell soient compris et exĂ©cutĂ©s, il faut respecter des rĂšgles bien prĂ©cises :
Respecter la casse, câest-Ă -dire lâutilisation des majuscules et des minuscules. Par exemple la commande
ls
existe mais pasLS
ouLs
.Comprendre que le caractĂšre espace est utilisĂ© pour sĂ©parer lâinstruction des options et des arguments et que par consĂ©quent ce caractĂšre ne doit plus ĂȘtre utilisĂ© dans les noms de fichiers ou de rĂ©pertoires.
Enfin, un terminal (ou une console) est un logiciel graphique qui lance un shell. Câest ce dernier (le shell) qui va exĂ©cuter vos instructions.
1.1. Invite de commande#
Lorsque vous lancez un shell, lâinvite de commande, câest-Ă -dire la zone Ă gauche du curseur, ressemble Ă quelque chose du type :
pierre@jeera:~$
ou bien encore
[ppoulain@cpu-node-16 ~]$
voire
toto $
Par convention, lâinvite de commande sera reprĂ©sentĂ©e dans la suite de ce document par le caractĂšre dollar «$
» en tout début de ligne :
$
Pour reproduire les commandes présentées, il ne faut pas taper ce caractÚre en début de ligne. Ainsi,
$ pwd
signifie : tapez lâinstruction pwd
dans le shell (sans le $
), puis validez cette commande en pressant la touche Entrée.
1.2. Préparer les données#
Pour reproduire les exemples suivants, vous allez prĂ©parer les donnĂ©es nĂ©cessaires. DĂ©placez-vous tout dâabord dans votre rĂ©pertoire utilisateur avec la commande cd
:
$ cd
Note
Ne tapez pas le caractĂšre $
en début de ligne et faites attention aux majuscules et au minuscules.
puis exécutez les commandes suivant :
$ wget https://github.com/pierrepo/unix-tutorial/raw/master/content/tuto1/unix.tgz
$ tar zxvf unix.tgz
$ cd unix
Ces commandes seront en partie expliquées plus loin. Pour ne pas réécrire complÚtement ces commandes, vous pouvez les copier / coller avec les raccourcis Ctrl+C pour copier et Ctrl+V (ou parfois Ctrl+Maj+C) pour coller.
1.3. Parcourir les répertoires et les fichiers#
1.3.1. Savoir oĂč on se trouve : pwd
#
La premiĂšre commande Ă connaĂźtre est la commande pwd
qui signifie print working directory et qui affiche le nom du répertoire courant.
Par exemple :
$ pwd
/shared/home/ppoulain/unix
Cela signifie quâon se trouve actuellement dans le rĂ©pertoire /shared/home/ppoulain/unix
.
Dans votre session, ppoulain
sera bien sur remplacĂ© par votre nom dâutilisateur sur le cluster IFB.
Sous Unix, les rĂ©pertoires et les fichiers sont organisĂ©s sous forme dâune structure en arbre. On parle dâarborescence (voir lâillustration de Software Carpentry).
Le répertoire dont dépendent tous les autres est le /
quâon appelle la « racine » (root en anglais), les diffĂ©rents sous-rĂ©pertoires sont sĂ©parĂ©s les uns des autres par le caractĂšre /
(le mĂȘme caractĂšre que la racine).
Dans le cas de /shared/home/ppoulain/unix
:
on se trouve dans le répertoire
unix
,qui est lui-mĂȘme un sous-rĂ©pertoire du rĂ©pertoire
ppoulain
,qui est lui-mĂȘme un sous-rĂ©pertoire du rĂ©pertoire
home
,qui est lui-mĂȘme un sous-rĂ©pertoire du rĂ©pertoire
shared
,qui est lui-mĂȘme un sous-rĂ©pertoire du rĂ©pertoire
/
(la racine du systĂšme de fichiers).
/shared/home/ppoulain/unix
est aussi appelĂ© un « chemin » car il indique la succession des rĂ©pertoires Ă suivre pour arriver jusquâau dernier rĂ©pertoire unix
. Dâabord la racine /
, puis shared
, puis home
, puis ppoulain
et enfin unix
.
Warning
Ne confondez pas « /
» qui, tout au dĂ©but dâun chemin, dĂ©signe la racine, du caractĂšre « /
» qui sépare deux répertoires successifs.
Lorsquâun chemin dĂ©bute par /
(la racine), on parle de chemin absolu. Il existe aussi des chemins relatifs (donc qui ne débutent pas par /
) que lâon verra plus tard.
1.3.2. Afficher le contenu dâun rĂ©pertoire : ls
#
La commande ls
(pour list) affiche le contenu dâun rĂ©pertoire :
$ ls
genomes paper.pdf protein.txt shopping.txt transferrin.csv transferrin.tsv
On peut modifier le comportement par dĂ©faut dâune commande avec une (ou plusieurs) option(s). Cette option est sĂ©parĂ©e de la commande ls
par un ou plusieurs espaces.
Par exemple avec lâoption -F
:
$ ls -F
genomes/ paper.pdf protein.txt shopping.txt transferrin.csv transferrin.tsv
Le caractĂšre /
a été ajouté à la fin de genomes
pour indiquer quâil sâagit dâun rĂ©pertoire.
Remarquez que les commandes suivantes donneraient aussi le mĂȘme rĂ©sultats :
$ ls -F
genomes/ paper.pdf protein.txt shopping.txt transferrin.csv transferrin.tsv
et pourquoi pas :
$ ls -F
genomes/ paper.pdf protein.txt shopping.txt transferrin.csv transferrin.tsv
Retenez quâil faut au moins un espace entre une commande et son option.
Une autre option sympa est lâoption -l
(la lettre l en minuscule) qui affiche des informations complĂ©mentaires sur le contenu dâun rĂ©pertoire :
$ ls -l
total 120
drwxr-xr-x 2 ppoulain ppoulain 4096 Mar 13 2019 genomes
-rw-r--r-- 1 ppoulain ppoulain 97830 Mar 13 2019 paper.pdf
-rw-r--r-- 1 ppoulain ppoulain 144 Mar 13 2019 protein.txt
-rw-r--r-- 1 ppoulain ppoulain 46 Mar 12 14:19 shopping.txt
-rw-r--r-- 1 ppoulain ppoulain 940 Mar 13 2019 transferrin.csv
-rw-r--r-- 1 ppoulain ppoulain 940 Mar 12 2019 transferrin.tsv
Lâoption -l
peut ĂȘtre associĂ©e Ă lâoption -h
pour afficher des tailles lisibles par des humains, câest-Ă -dire en octets, ko, Mo et Go.
$ ls -l -h
total 120K
drwxr-xr-x 2 ppoulain ppoulain 4.0K Mar 13 2019 genomes
-rw-r--r-- 1 ppoulain ppoulain 96K Mar 13 2019 paper.pdf
-rw-r--r-- 1 ppoulain ppoulain 144 Mar 13 2019 protein.txt
-rw-r--r-- 1 ppoulain ppoulain 46 Mar 12 14:19 shopping.txt
-rw-r--r-- 1 ppoulain ppoulain 940 Mar 13 2019 transferrin.csv
-rw-r--r-- 1 ppoulain ppoulain 940 Mar 12 2019 transferrin.tsv
Le fichier paper.pdf
a une taille de 96 kilo octets.
Les options peuvent aussi ĂȘtre combinĂ©es :
$ ls -lh
total 120K
drwxr-xr-x 2 ppoulain ppoulain 4.0K Mar 13 2019 genomes
-rw-r--r-- 1 ppoulain ppoulain 96K Mar 13 2019 paper.pdf
-rw-r--r-- 1 ppoulain ppoulain 144 Mar 13 2019 protein.txt
-rw-r--r-- 1 ppoulain ppoulain 46 Mar 12 14:19 shopping.txt
-rw-r--r-- 1 ppoulain ppoulain 940 Mar 13 2019 transferrin.csv
-rw-r--r-- 1 ppoulain ppoulain 940 Mar 12 2019 transferrin.tsv
Une combinaison dâoptions intĂ©ressantes est -lhrt
qui affiche en dernier (en bas de la liste) le fichier modifié le plus récemment :
$ ls -lhrt
total 120K
-rw-r--r-- 1 ppoulain ppoulain 940 Mar 12 2019 transferrin.tsv
drwxr-xr-x 2 ppoulain ppoulain 4.0K Mar 13 2019 genomes
-rw-r--r-- 1 ppoulain ppoulain 940 Mar 13 2019 transferrin.csv
-rw-r--r-- 1 ppoulain ppoulain 96K Mar 13 2019 paper.pdf
-rw-r--r-- 1 ppoulain ppoulain 144 Mar 13 2019 protein.txt
-rw-r--r-- 1 ppoulain ppoulain 46 Mar 12 14:19 shopping.txt
Lâoption -t
affiche les fichiers du plus rĂ©cent au plus ancien et lâoption -r
inverse cet ordre. Ici, le dernier fichier modifié est shopping.txt
.
Lâoption -a
affiche tout le contenu du répertoire courant, notamment les fichiers et répertoires cachés qui commencent (sous Unix) par le caractÚre .
:
$ ls -a
. .. genomes paper.pdf protein.txt shopping.txt transferrin.csv transferrin.tsv
Par défaut, il y a deux répertoires cachés qui sont toujours présents et sont créés automatiquement : .
et ..
Le répertoire
.
désigne le répertoire courant.Le répertoire
..
désigne le répertoire parent. Par exemple, si on est dans le répertoire/shared/home/ppoulain/unix
, alors..
désigne le répertoire/shared/home/ppoulain
.
Enfin, la commande ls
peut aussi afficher le contenu dâun rĂ©pertoire passĂ© en argument :
$ ls genomes
NC_000907_head.gbk NC_004459_head.gbk NC_007168_head.gbk NC_011333_head.gbk
NC_000964_head.gbk NC_004461_head.gbk NC_007350_head.gbk NC_011852_head.gbk
NC_002505_head.gbk NC_004917_head.gbk NC_009033_head.gbk NC_012655_head.gbk
NC_002570_head.gbk NC_006298_head.gbk NC_009477_head.gbk NC_013893_head.gbk
NC_002976_head.gbk NC_006840_head.gbk NC_011184_head.gbk NC_014205_head.gbk
Comme pour les options, il faut au moins un espace entre une commande et son ou ses arguments.
On peut mĂȘme obtenir des informations dĂ©taillĂ©es sur un fichier en particulier :
$ ls -lh paper.pdf
-rw-r--r-- 1 ppoulain ppoulain 96K Mar 13 2019 paper.pdf
Dans cet exemple, on apprend que le fichier paper.pdf
appartient Ă lâutilisateur ppoulain
, quâil a Ă©tĂ© modifiĂ© pour la derniĂšre fois le 13 mars 2019 et quâil a une taille de 96 kilo-octets.
Note
Dans cet exemple, ls
est la commande Unix, -lh
sont les options et paper.pdf
est lâargument.
Cette anatomie dâune instruction Unix est schĂ©matisĂ©e dans lâillustration suivante :
Source : Software Carpentry.
1.3.3. Se documenter : man
et --help
#
La commande man
(pour manuel) affiche la documentation associée à une commande. Par exemple pour la commande ls
:
$ man ls
Utilisez les flĂšches â et â pour naviguer dans cette aide. La touche Espace saute une page Ă la fois. La touche Q quitte lâaide et revient au shell.
Par ailleurs, de nombreuses commandes Unix disposent de lâoption --help
qui affiche une aide succincte :
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically 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.,
[...]
1.3.4. PrĂȘter attention aux noms de fichiers et rĂ©pertoires#
Sous Unix, les noms de fichiers et de rĂ©pertoires sont sensibles Ă la casse, câest-Ă -dire aux majuscules et aux minuscules. Par consĂ©quent, le shell fait la diffĂ©rence entre le fichier test.txt
et le fichier Test.txt
.
Par ailleurs, lâextension de fichier est facultative et purement indicative. Le shell ne lâutilise pas. Elle sert simplement Ă lâutilisateur pour mieux organiser ses fichiers. Un nom de fichier du type test
ou test.my_extension
est parfaitement valide. On peut mĂȘme nommer un rĂ©pertoire directory.txt
(mais ce nâest pas trĂšs malin đ).
Enfin, pour nommer un fichier ou un répertoire, on peut utiliser :
les lettres minuscules,
les lettres majuscules,
les chiffres,
le tiret du milieu «
-
» (mais pas comme premier caractÚre du nom),le tiret du bas «
_
»,le point «
.
».
On vous dĂ©conseille fortement lâutilisation dâautres caractĂšres comme +()[]éÚà Ăčç
. Certains caractĂšres sont mĂȘme interdits (<>|;&
).
Enfin, ne mettez jamais un espace dans un nom de fichier ou de rĂ©pertoire. J-A-M-A-I-S. Unix lâautorise mais câest trĂšs pĂ©nible par la suite car lâespace est utilisĂ© pour sĂ©parer les options et les arguments dâune commande.
Pour le reste, laisser faire votre imagination et utilisez des noms de fichiers et de répertoires expressifs.
1.3.5. Se déplacer : cd
#
La commande cd
(pour change directory) permet de se dĂ©placer dâun rĂ©pertoire Ă lâautre. Par exemple :
$ pwd
/shared/home/ppoulain/unix
$ cd genomes
$ pwd
/shared/home/ppoulain/unix/genomes
Partant du répertoire /shared/home/ppoulain/unix
, on sâest dĂ©placĂ© dans le rĂ©pertoire /shared/home/ppoulain/unix/genomes
.
Dans lâinstruction cd genomes
, le répertoire genomes
est un argument de la commande cd
. Ici, le répertoire genomes
est un chemin relatif (car il ne débute pas par /
). Câest-Ă -dire quâon a indiquĂ© le nom de ce rĂ©pertoire (genomes
) par rapport au répertoire dans lequel nous étions (/shared/home/ppoulain/unix
). Bien sûr, la commande cd
fonctionne trĂšs bien avec un chemin absolu. La commande
$ cd /shared/home/ppoulain/unix/genomes
conduirait au mĂȘme rĂ©sultat.
Un moyen simple de revenir dans le rĂ©pertoire parent est dâutiliser le raccourci ..
:
$ pwd
/shared/home/ppoulain/unix/genomes
$ cd ..
$ pwd
/shared/home/ppoulain/unix
Un autre raccourci pratique pour revenir dans le rĂ©pertoire utilisateur (rĂ©pertoire par dĂ©faut dans lequel se trouve lâutilisateur lorsquâil lance un shell) est ~
:
$ pwd
/shared/home/ppoulain/unix
$ cd ~
$ pwd
/shared/home/ppoulain
Note
Simplement taper la commande cd
(sans argument) ramĂšne aussi lâutilisateur dans son rĂ©pertoire personnel.
1.3.6. Créer un répertoire : mkdir
#
Revenez au préalable dans le bon répertoire avec la commande :
$ cd ~/unix
$ pwd
/shared/home/ppoulain/unix
La commande mkdir
(pour make directory) crée un répertoire :
$ ls
genomes paper.pdf protein.txt shopping.txt transferrin.csv transferrin.tsv
$ mkdir test
$ ls
genomes paper.pdf protein.txt shopping.txt test transferrin.csv transferrin.tsv
1.3.7. Copier : cp
#
La commande cp
(pour copy) copie un fichier vers un nouveau fichier :
$ ls
genomes paper.pdf protein.txt shopping.txt test transferrin.csv transferrin.tsv
$ cp paper.pdf article.pdf
$ ls
article.pdf genomes paper.pdf protein.txt shopping.txt test transferrin.csv transferrin.tsv
cp
peut copier plusieurs fichiers dans un répertoire :
$ cp paper.pdf article.pdf test
$ ls test
article.pdf paper.pdf
Câest toujours le dernier argument de la ligne de commande qui est utilisĂ© comme destination (ici test
) de la copie.
cp
peut aussi copier un rĂ©pertoire dans un autre rĂ©pertoire avec lâoption -r
:
$ cp -r genomes test
$ ls test
article.pdf genomes paper.pdf
1.3.8. Visualiser un bout dâarborescence : tree
#
La commande tree
permet de visualiser une partie de lâarborescence des rĂ©pertoires et des fichiers. Par exemple, pour visualiser lâarborescence du rĂ©pertoire test
:
$ tree test/
test/
âââ article.pdf
âââ genomes
â âââ NC_000907_head.gbk
â âââ NC_000964_head.gbk
â âââ NC_002505_head.gbk
â âââ NC_002570_head.gbk
â âââ NC_002976_head.gbk
â âââ NC_004459_head.gbk
â âââ NC_004461_head.gbk
â âââ NC_004917_head.gbk
â âââ NC_006298_head.gbk
â âââ NC_006840_head.gbk
â âââ NC_007168_head.gbk
â âââ NC_007350_head.gbk
â âââ NC_009033_head.gbk
â âââ NC_009477_head.gbk
â âââ NC_011184_head.gbk
â âââ NC_011333_head.gbk
â âââ NC_011852_head.gbk
â âââ NC_012655_head.gbk
â âââ NC_013893_head.gbk
â âââ NC_014205_head.gbk
âââ paper.pdf
1 directory, 22 files
1.3.9. Renommer et déplacer : mv
#
La commande mv
(pour move) renomme des fichiers ou des répertoires :
$ ls
article.pdf genomes paper.pdf protein.txt shopping.txt test transferrin.csv transferrin.tsv
$ mv article.pdf article2.pdf
$ ls
article2.pdf genomes paper.pdf protein.txt shopping.txt test transferrin.csv transferrin.tsv
$ mv test test2
$ ls
article2.pdf genomes paper.pdf protein.txt shopping.txt test2 transferrin.csv transferrin.tsv
mv
déplace aussi des fichiers ou des répertoires dans un autre répertoire :
$ ls
article2.pdf genomes paper.pdf protein.txt shopping.txt test2 transferrin.csv transferrin.tsv
$ mkdir test3
$ mv article2.pdf test2 test3
$ ls test3
article2.pdf test2
$ ls
genomes paper.pdf protein.txt shopping.txt test3 transferrin.csv transferrin.tsv
1.3.10. Supprimer : rm
#
La commande rm
(pour remove) supprime des fichiers ou des répertoires :
$ cd test3
$ ls
article2.pdf test2
$ rm article2.pdf
$ ls
test2
Pour que rm
rĂ©alise la suppression sans demander de confirmation, il faut utiliser lâoption-f
.
Pour supprimer un rĂ©pertoire, il faut utiliser lâoption supplĂ©mentaire -r
:
$ rm -rf test2
$ ls
Warning
Il nây a pas de corbeille dans le shell Unix, câest-Ă -dire quâil nây a aucune possibilitĂ© de rĂ©cupĂ©rer un fichier ou un rĂ©pertoire effacĂ© par erreur. Pensez Ă sauvegarder rĂ©guliĂšrement vos fichiers.
1.3.11. Automatiser (un peu)#
Les caractĂšres *
et ?
peuvent remplacer nâimporte quels caractĂšres dans les noms de fichiers ou de rĂ©pertoires :
*
remplace 0, 1 ou plus caractĂšres.?
remplace exactement 1 caractĂšre.
Par exemple :
$ ls *txt
protein.txt shopping.txt
$ ls transferrin.?sv
transferrin.csv transferrin.tsv
Ces caractĂšres sont trĂšs utiles quand il sâagit dâeffectuer une opĂ©ration sur plusieurs fichiers en mĂȘme temps :
$ mkdir test4
$ cp transferrin.* test4
$ ls test4
transferrin.csv transferrin.tsv
La commande cp transferrin.* test4
est un raccourci pour
cp transferrin.csv transferrin.tsv test4
Cela fonctionne avec autant de fichiers quâon le souhaite.
1.4. Trucs et astuces#
Ăcrire des commandes dans un shell peut sembler rĂ©barbatif mais on gagne rapidement en efficacitĂ© avec les astuces suivantes.
1.4.1. Rappel des anciennes commandes#
La flĂšche du haut â rappelle les commandes prĂ©cĂ©dentes (depuis la plus rĂ©cente jusquâĂ la plus ancienne).
1.4.2. Complétion automatique#
La touche tabulation Tab est utile pour complĂ©ter une commande, un nom de rĂ©pertoire ou de fichier. Appuyez deux fois sur Tab en cas dâambiguĂŻtĂ©.
Par exemple, si vous tapez /h
puis la touche Tab, le shell va compléter automatiquement à /home
.
1.4.3. ArrĂȘter une commande en cours#
Pressez la touche Ctrl et la touche C en mĂȘme temps pour arrĂȘter une commande en cours.
1.4.4. Copier / coller#
Pour copier / coller quelque chose dans le shell, sélectionnez du texte puis utilisez les combinaisons de touches Ctrl+C pour copier et Ctrl+V (ou Ctrl+Maj+V) pour coller.
1.5. Explorer le contenu de fichiers#
JusquâĂ prĂ©sent, on sâest contentĂ© dâafficher le contenu de rĂ©pertoires et de dĂ©placer ou copier des fichiers, sans connaĂźtre leur contenu.
Pour afficher le contenu dâun fichier, on utilise la commande cat
(pour concatenate) :
$ cat shopping.txt
banana 21
pineaple 1
pear 3
apple 10
orange 4
Bien sĂ»r, afficher le contenu dâun fichier dans un terminal nâa de sens ici que pour un fichier texte. En effet, afficher le contenu dâun fichier binaire produit une suite de caractĂšres incomprĂ©hensibles.
$ cat paper.pdf
xrefbjfalse/SM 0.02/Type/ExtGState>>
0 1
0000000000 65535 f
11 2
0000073672 00000 n
0000077288 00000 n
15 1
0000077496 00000 n
48 4
0000077860 00000 n
0000097345 00000 n
0000097389 00000 n
0000097434 00000 n
trailer
<</Size 52/Root 14 0 R/Info 12 0 R/ID[<C52AD85A8BAFBD722C6FCD30421B945E><33F927FA361D6A4FA1263C03468E9074>]/Prev 116>>
startxref
97487
%%EOF
Note
Dans la suite, nous nâexplorerons que le contenu de fichiers textes.
La commande cat
nâest utile que si le fichier est assez court. Si ce nâest pas le cas, le contenu du fichier va dĂ©filer dâun seul coup Ă lâĂ©cran, sans quâon puisse en voir le dĂ©but. Par exemple :
$ cat transferrin.csv
1TFD,Oryctolagus cuniculus,304
2D3I,Gallus gallus,686
2O84,Homo sapiens,337
3FGS,Homo sapiens,337
3QYT,Homo sapiens,679
3SKP,Homo sapiens,342
4H0W,Homo sapiens,679
4X1B,Homo sapiens,679
5H52,Homo sapiens,679
5WTD,Homo sapiens,679
5X5P,Homo sapiens,679
6CTC,Homo sapiens,679
[...]
Pour les gros fichiers, on préfÚre utiliser la commande less
qui affiche progressivement le contenu dâun fichier :
$ less transferrin.csv
Comme avec la commande man
, les flĂšches â et â permettent de naviguer dans le contenu du fichier. La touche Espace saute une page Ă la fois. La touche Q quitte less
et revient au shell.
La commande head
affiche les premiĂšres lignes dâun fichier :
$ head transferrin.csv
1A8E,Homo sapiens,329
1A8F,Homo sapiens,329
1AIV,Gallus gallus,686
1AOV,Anas platyrhynchos,686
1B3E,Homo sapiens,330
1D3K,Homo sapiens,329
1D4N,Homo sapiens,329
1DOT,Anas platyrhynchos,686
1DTG,Homo sapiens,334
1FQE,Homo sapiens,331
Par défaut, head
affiche les 10 premiĂšres lignes du fichier. Lâoption -n
précise le nombre de lignes à afficher. Par exemple :
$ head -n 2 transferrin.csv
1A8E,Homo sapiens,329
1A8F,Homo sapiens,329
Réciproquement, la commande tail
affiche les derniĂšres lignes dâun fichier texte. Lâoption -n
est également disponible :
$ tail transferrin.csv
2O84,Homo sapiens,337
3FGS,Homo sapiens,337
3QYT,Homo sapiens,679
3SKP,Homo sapiens,342
4H0W,Homo sapiens,679
4X1B,Homo sapiens,679
5H52,Homo sapiens,679
5WTD,Homo sapiens,679
5X5P,Homo sapiens,679
6CTC,Homo sapiens,679
$ tail -n 2 transferrin.csv
5X5P,Homo sapiens,679
6CTC,Homo sapiens,679
Dans lâexemple ci-dessus, on a affichĂ© les 2 derniĂšres lignes du fichier transferrin.csv
.
1.6. Créer ou éditer un fichier texte#
Nano est un éditeur de texte qui fonctionne dans un shell, donc sans interface graphique, sans menu, sans icÎne, contrairement à des éditeurs de texte comme Notepad++.
Pour le lancer, on utilise la commande nano
:
$ nano
Et on obtient quelque chose du type :
Selon la version de votre systĂšme Unix, il se peut que lâinterface soit en anglais mais les raccourcis clavier seront les mĂȘmes.
On peut tout de suite commencer Ă taper du texte.
Pour sauvegarder le texte ainsi entrĂ© dans nano, on utilise la combinaison de touches Ctrl+O (câest-Ă -dire quâon presse en mĂȘme temps les touches Ctrl et O). On entre ensuite le nom quâon souhaite donner au fichier (par exemple test.txt
) puis on valide par la touche Entrée.
Les diffĂ©rentes combinaisons de touches sont rappelĂ©es en bas de lâĂ©cran. Le caractĂšre « ^
» désigne la touche Ctrl.
On peut continuer Ă Ă©diter le fichier puis lâenregistrer, et ainsi de suite.
Pour quitter nano, on utilise la combinaison de touches Ctrl+X.
On se retrouve alors dans le shell et on peut vérifier que le fichier (ici test.txt
) a bien été créé dans le répertoire courant.
$ ls
genomes paper.pdf protein.txt shopping.txt test.txt transferrin.csv transferrin.tsv
On peut aussi ouvrir un fichier texte existant en indiquant en argument le nom du fichier Ă ouvrir :
$ nano shopping.txt
Modifiez le fichier shopping.txt
avec nano :
ajouter la ligne
kiwi 16
Ă la fin du fichier,remplacer le nombre dâoranges par
8
.
Enregistrez le fichier (Ctrl+O puis Entrée) et enfin quitter nano (Ctrl+X).
Vérifiez avec la commande cat
que les modifications ont bien été prises en compte :
$ cat shopping.txt
Aide
Le fichier shopping.txt
devrait ressembler Ă ceci :
banana 21
pineaple 1
pear 3
apple 10
orange 8
kiwi 16
1.7. Manipuler des données#
1.7.1. Compter : wc
#
La commande wc
(pour word count) compte le nombre de lignes, de mots et de caractĂšres dâun fichier.
$ wc shopping.txt
6 12 54 shopping.txt
On apprend ainsi que le fichier shopping.txt
contient 6 lignes, 12 mots et 54 caractÚres, ou des valeurs équivalentes si vous avez modifé ce fichier.
Lâoption -l
indique Ă la commande wc
de ne compter que le nombre de lignes. Et réciproquement pour -w
et le nombre de mots, et -c
et le nombre de caractĂšres.
Lorsque plusieurs fichiers sont fournis en argument Ă la commande wc
, le total est aussi renvoyé :
$ wc -l transferrin.*
41 transferrin.csv
41 transferrin.tsv
82 total
Les fichiers transferrin.csv
et transferrin.tsv
contiennent chacun 41 lignes, soit un total de 82 lignes.
1.7.2. Trier : sort
#
La commande sort
trie le contenu dâun fichier.
$ cat shopping.txt
banana 21
pineaple 1
pear 3
apple 10
orange 8
kiwi 16
$ sort shopping.txt
apple 10
banana 21
kiwi 16
orange 8
pear 3
pineaple 1
Les lignes ont été triées par ordre alphabétique.
La commande sort
a également la notion de colonnes (ou de champs). Par défaut, le séparateur de champs est un caractÚre blanc (espace, tabulation). Dans le fichier shopping.txt
, sort
trouve une premiÚre colonne avec le nom des fruits et une seconde avec les quantités.
On peut trier le fichier shopping.txt
suivant le nombre de fruits en indiquant Ă sort
dâutiliser la 2e colonne avec lâoption -k
:
$ sort -k 2 shopping.txt
pineaple 1
apple 10
kiwi 16
banana 21
pear 3
orange 8
Les lignes sont alors triées suivant la seconde colonne, mais par ordre alphabétique, ce qui explique que 10
soit avant 3
. Pour trier explicitement des valeurs numĂ©riques, on utilise lâoption -g
:
$ sort -k 2 -g shopping.txt
pineaple 1
pear 3
orange 8
apple 10
kiwi 16
banana 21
Lâordre numĂ©rique est ainsi respectĂ© puisque 3 est plus petit (donc situĂ© avant) que 10.
Enfin lâoption -r
inverse le tri initial :
$ sort -r shopping.txt
pineaple 1
pear 3
orange 8
kiwi 16
banana 21
apple 10
On peut aussi utiliser lâoption -r
pour trier des valeurs numériques (option -g
) sur une colonne donnée (option -k
) :
$ sort -k 2 -g -r shopping.txt
banana 21
kiwi 16
apple 10
orange 8
pear 3
pineaple 1
1.7.3. Trouver les éléments uniques : uniq
#
La commande uniq
affiche les éléments uniques.
Par exemple avec le contenu du fichier protein.txt
:
$ cat protein.txt
insulin
insulin
insulin
insulin
insulin
insulin
integrin
integrin
rhodopsin
rhodopsin
rhodopsin
transferrin
transferrin
transferrin
transferrin
On obtient alors uniquement les lignes uniques :
$ uniq protein.txt
insulin
integrin
rhodopsin
transferrin
Lâoption -c
compte le nombre de fois quâun Ă©lĂ©ment est prĂ©sent :
$ uniq -c protein.txt
6 insulin
2 integrin
3 rhodopsin
4 transferrin
Note
La commande uniq
ne fonctionne que sur un fichier triĂ©, câest-Ă -dire pour lequel les lignes sont dĂ©jĂ triĂ©es par ordre alphabĂ©tique.
1.7.4. Extraire un colonne : cut
#
La commande cut
extrait une ou plusieurs colonnes dâun fichier.
Par exemple avec le fichier transferrin.csv
qui contient les identifiants PDB de structures de transferrines, avec lâorganisme dâorigine et le nombre dâacides aminĂ©s de la structure :
$ head -n 5 transferrin.csv
1A8E,Homo sapiens,329
1A8F,Homo sapiens,329
1AIV,Gallus gallus,686
1AOV,Anas platyrhynchos,686
1B3E,Homo sapiens,330
On souhaite extraire la 2e colonne qui contient des noms dâorganismes :
$ cut -d "," -f 2 transferrin.csv
Homo sapiens
Homo sapiens
Gallus gallus
Anas platyrhynchos
Homo sapiens
Homo sapiens
[...]
Lâoption -d
spĂ©cifie le dĂ©limiteur, câest-Ă -dire le caractĂšre utilisĂ© pour sĂ©parer les diffĂ©rents champs (les colonnes). Par dĂ©faut, cut
utilise la tabulation. Nous manipulons ici un fichier au format CSV (pour comma-separated values) dont les colonnes sont séparées par une virgule.
Lâoption -f
prĂ©cise le numĂ©ro du champ quâon souhaite extraire (ici le 2e champ).
1.8. Gérer les flux : redirection et emboßtement#
On souhaite extraire du fichier transferrin.csv
la liste des diffĂ©rents organismes dâoĂč proviennent les structures de transferrines. On a besoin pour cela de rĂ©aliser 3 Ă©tapes :
Extraire la liste des organismes (avec
cut
).Trier par ordre alphabétique ces organismes (avec
sort
).Trouver les différents organismes (avec
uniq
). LâĂ©tape 2 est justifiĂ©e par le fait queuniq
ne fonctionne que sur des données triées.
Pour stocker lâinformation, dâune Ă©tape Ă lâautre, on peut renvoyer le rĂ©sultat dans un fichier avec la redirection «>
».
1.8.1. Ătape 1 (cut
)#
$ cut -d "," -f 2 transferrin.csv > organism.txt
Le rĂ©sultat de la commande ne sâaffiche pas Ă lâĂ©cran mais est redirigĂ© dans le fichier organism.txt
.
On peut jeter un oeil au contenu de organism.txt
avec les commandes cat
, less
, head
ou tail
:
$ head organism.txt
Homo sapiens
Homo sapiens
Gallus gallus
Anas platyrhynchos
Homo sapiens
Homo sapiens
Homo sapiens
Anas platyrhynchos
Homo sapiens
Homo sapiens
1.8.2. Ătape 2 (sort
)#
$ sort organism.txt > organism_sorted.txt
Ici encore, rien ne sâaffiche Ă lâĂ©cran mais on peut contrĂŽler le rĂ©sultat :
$ head organism_sorted.txt
Anas platyrhynchos
Anas platyrhynchos
Gallus gallus
Gallus gallus
Gallus gallus
Gallus gallus
Gallus gallus
Gallus gallus
Gallus gallus
1.8.3. Ătape 3 (uniq
)#
$ uniq organism_sorted.txt
Anas platyrhynchos
Gallus gallus
Homo sapiens
Oryctolagus cuniculus
Sus scrofa
Les structures de transferrines du fichier transferrin.csv
proviennent de 5 organismes différents.
1.8.4. EmboĂźtement#
Pour rĂ©aliser lâanalyse prĂ©cĂ©dente, nous avons dĂ» crĂ©er deux fichiers intermĂ©diaires : organism.txt
et organism_sorted.txt
.
Pour Ă©viter la crĂ©ation de ces fichiers temporaires et rĂ©aliser lâanalyse en une seule fois, on emboĂźte (« chaĂźne ») les diffĂ©rentes Ă©tapes. La sortie produite par une Ă©tape devient lâentrĂ©e de lâĂ©tape suivante (voir lâillustration de Software Carpentry). On utilise pour cela le caractĂšre «|
» :
$ cut -d "," -f 2 transferrin.csv | sort | uniq
Anas platyrhynchos
Gallus gallus
Homo sapiens
Oryctolagus cuniculus
Sus scrofa
On obtient le mĂȘme rĂ©sultat que prĂ©cĂ©demment mais en une seule Ă©tape et sans fichier intermĂ©diaire.
Si on souhaite obtenir le nombre de structures par organisme, on peut trĂšs rapidement modifier la commande prĂ©cĂ©dente en utilisant lâoption -c
de uniq
:
$ cut -d "," -f 2 transferrin.csv | sort | uniq -c
2 Anas platyrhynchos
10 Gallus gallus
26 Homo sapiens
2 Oryctolagus cuniculus
1 Sus scrofa
Et si on préfÚre travailler avec le fichier transferrin.tsv
dont les colonnes sont séparées par des tabulations :
$ cut -f 2 transferrin.tsv | sort | uniq -c
2 Anas platyrhynchos
10 Gallus gallus
26 Homo sapiens
2 Oryctolagus cuniculus
1 Sus scrofa
Rappel
La tabulation est le caractÚre par défaut utilisé par la commande cut
pour séparer les différentes colonnes.
1.9. Chercher#
1.9.1. Chercher dans des fichiers : grep
#
La commande grep
cherche un motif dans un ou plusieurs fichiers et renvoie les lignes correspondantes :
$ grep "apple" shopping.txt
apple 10
Le motif à rechercher est indiqué entre guillemets.
Lâoption -n
affiche le numéro de la ligne dans lequel est trouvé le motif :
$ grep -n "apple" shopping.txt
4:apple 10
Si on recherche un motif dans plusieurs fichiers, le nom des fichiers dans lequel le motif est trouvé est également affiché :
$ grep "DEFI" genomes/*.gbk
genomes/NC_000907_head.gbk:DEFINITION Haemophilus influenzae Rd KW20, complete genome.
genomes/NC_000964_head.gbk:DEFINITION Bacillus subtilis subsp. subtilis str. 168, complete genome.
genomes/NC_002505_head.gbk:DEFINITION Vibrio cholerae O1 biovar El Tor str. N16961 chromosome I, complete
genomes/NC_002570_head.gbk:DEFINITION Bacillus halodurans C-125, complete genome.
genomes/NC_002976_head.gbk:DEFINITION Staphylococcus epidermidis RP62A, complete genome.
genomes/NC_004459_head.gbk:DEFINITION Vibrio vulnificus CMCP6 chromosome I, complete genome.
genomes/NC_004461_head.gbk:DEFINITION Staphylococcus epidermidis ATCC 12228, complete genome.
genomes/NC_004917_head.gbk:DEFINITION Helicobacter hepaticus ATCC 51449, complete genome.
genomes/NC_006298_head.gbk:DEFINITION Haemophilus somnus 129PT plasmid pHS129, complete sequence.
genomes/NC_006840_head.gbk:DEFINITION Vibrio fischeri ES114 chromosome I, complete genome.
genomes/NC_007168_head.gbk:DEFINITION Staphylococcus haemolyticus JCSC1435, complete genome.
genomes/NC_007350_head.gbk:DEFINITION Staphylococcus saprophyticus subsp. saprophyticus ATCC 15305,
genomes/NC_009033_head.gbk:DEFINITION Staphylothermus marinus F1 chromosome, complete genome.
genomes/NC_009477_head.gbk:DEFINITION Staphylococcus aureus subsp. aureus JH9 plasmid pSJH901, complete
genomes/NC_011184_head.gbk:DEFINITION Vibrio fischeri MJ11 chromosome I, complete sequence.
genomes/NC_011333_head.gbk:DEFINITION Helicobacter pylori G27, complete genome.
genomes/NC_011852_head.gbk:DEFINITION Haemophilus parasuis SH0165, complete genome.
genomes/NC_012655_head.gbk:DEFINITION Bacillus anthracis str. A0248 plasmid pXO2, complete sequence.
genomes/NC_013893_head.gbk:DEFINITION Staphylococcus lugdunensis HKU09-01 chromosome, complete genome.
genomes/NC_014205_head.gbk:DEFINITION Staphylothermus hellenicus DSM 12710 chromosome, complete genome.
On peut bien sûr emboßter / chaßner les commandes grep
si on cherche plusieurs motifs :
$ grep "DEFI" genomes/*.gbk | grep "Staphyloco"
genomes/NC_002976_head.gbk:DEFINITION Staphylococcus epidermidis RP62A, complete genome.
genomes/NC_004461_head.gbk:DEFINITION Staphylococcus epidermidis ATCC 12228, complete genome.
genomes/NC_007168_head.gbk:DEFINITION Staphylococcus haemolyticus JCSC1435, complete genome.
genomes/NC_007350_head.gbk:DEFINITION Staphylococcus saprophyticus subsp. saprophyticus ATCC 15305,
genomes/NC_009477_head.gbk:DEFINITION Staphylococcus aureus subsp. aureus JH9 plasmid pSJH901, complete
genomes/NC_013893_head.gbk:DEFINITION Staphylococcus lugdunensis HKU09-01 chromosome, complete genome.
Lâoption -c
de grep
indique combien de génomes de staphylocoques ont été trouvés :
$ grep "DEFI" genomes/*.gbk | grep -c "Staphyloco"
6
1.9.2. Petit défi#
Construisez lâenchaĂźnement de commandes Unix qui :
cherche le motif
DEFINITION
dans tous les fichiers GenBank du répertoiregenomes
;cherche les génomes de staphylocoques (
Staphylococcus
) ;ne conserve que les noms des organismes ;
renvoie le tout dans le fichier
all_staphylo.txt
.
Solution
Voici une solution possible :
$ grep "DEFI" genomes/*.gbk | grep "Staphylo" | cut -d " " -f 3- > all_staphylo.txt
1.9.3. Chercher des fichiers : find
#
La commande find
recherche des fichiers ou des répertoires.
On revient tout dâabord dans le rĂ©pertoire parent :
$ pwd
/shared/home/ppoulain/unix
$ cd ..
$ pwd
/shared/home/ppoulain
On cherche maintenant les fichiers avec lâextension .csv
:
$ find ./ -name "*.csv"
./unix/transferrin.csv
La commande find
prend comme argument lâendroit Ă partir duquel on cherche, ici le rĂ©pertoire courant dĂ©signĂ© par ./
(on aurait aussi pu simplement indiquer « .
»). Puis on prĂ©cise le critĂšre de recherche avec lâoption -name
, ici tous les fichiers qui se terminent par .csv
.
1.10. Se souvenir#
La commande history
affiche toutes les commandes que vous avez entrées, de la plus ancienne à la plus récente.
Ainsi, la commande
$ history
produit une sortie du type :
[...]
582 grep "apple" shopping.txt
583 grep -n "apple" shopping.txt
584 grep "DEFI" genomes/*.gbk
585 grep "DEFI" genomes/*.gbk | grep "Staphyloco"
586 grep "DEFI" genomes/*.gbk | grep -c "Staphyloco"
587 pwd
588 cd ..
589 pwd
590 find ./ -name "*.csv"
591 history
Le numĂ©ro Ă cĂŽtĂ© de chaque commande est le numĂ©ro de la commande dans lâordre oĂč elle a Ă©tĂ© lancĂ©e dans le shell. Vous aurez bien sĂ»r des numĂ©ros et des commandes diffĂ©rentes.
On peut trÚs simplement rappeler une commande à partir de son numéro précédé du caractÚre «!
». Par exemple :
$ !590
find ./ -name "*.csv"
./unix/transferrin.csv
Enfin, lorsquâon a travaillĂ© un moment dans le shell, il peut ĂȘtre utile de sauvegarder lâhistorique des commandes quâon a lancĂ©es avec :
$ history > 2019-03-14_history.txt
Ici, 2019-03-14
représente la date au format ISO 8601 AAAA-MM-JJ
(année-mois-jour).
Pour automatiser cette sauvegarde avec la date du jour :
$ history > $(date --iso-8601)_history.txt
Nous verrons le fonctionnement de $(date --iso-8601)
prochainement.
1.11. Préparation de la prochaine séance#
Afin de vérifier que vous avez les droits nécessaires pour réaliser les activités pratiques de la prochaine séance, exécutez dans un shell la commande suivante :
$ touch /shared/projects/2501_duo/$USER/test
Signalez tout problĂšme ou message dâerreur.