diff --git a/unix/exercices/enchainer.tml b/unix/exercices/enchainer.tml new file mode 100644 index 0000000..2801b0b --- /dev/null +++ b/unix/exercices/enchainer.tml @@ -0,0 +1,356 @@ + + + +
+On n'a pas traité de la commande cat dans la page consacrée aux +commandes de base, parce que cat s'utilise le plus souvent avec des +redirections.
+ ++cat bla blo > blu ++
et
++cat bla blo >> blu ++ +
+Que se passe-t-il, pour chaque ligne, selon que le fichier blu +existe ou n'existe pas ?
grep
-Ces exercices sont des questions de cours : les solutions se trouvent
-toutes dans les pages de man des commandes en question. On suppose donc
-connues les commandes de less, qui servent à se déplacer dans les pages de man...
-Testez les commandes sur des fichiers et répertoires d'essai pour vous faire
-la main et comprendre ce qui se passe. Pour une présentation élémentaire de
-grep
, vous pouvez aller lire le cours.
-
Ces exercices sont des questions de cours : les solutions se
+trouvent toutes dans les pages de man des commandes
+en question. On suppose donc connues les commandes de less, qui
+servent à se déplacer dans les pages de man... Testez les commandes sur
+des fichiers et répertoires d'essai pour vous faire la main et comprendre
+ce qui se passe. Pour une présentation élémentaire de grep
,
+vous pouvez aller lire le cours.
Pour voir la solution, cliquer sur le bouton &icone.solution;.
--grep
grep
Une partie des exercices de cette section ne sont pas encore corrigés -(dernier exercice des filtres et redirections, deux exercices à propos -des pages jaunes).
- +less
?less
?less
d'ouvrir le fichier en
plaçant en haut de l'écran la ligne n ?less
d'ouvrir le fichier en
plaçant en haut de l'écran la première ligne où apparaît un motif
donné ?less
qui
permettent de chercher un motif dans un fichier, respectivement après et avant
la position courante ?less
de chercher le mot à
partir de la première ligne du fichier, et ce où que l'on soit dans le
fichier ?-i
à
less
? Quelle option faut-il mettre à la place de
-i
pour chercher toTo
tout en ignorant la casse des
caractères ?/
?rmdir
peut prendre des
+mkdir
peut prendre des
options ?rmdir -p toto/tata/tutu/ -+
cp
et mv
+Ces exercices sont des questions de cours : les solutions se trouvent
+toutes dans les pages de man des commandes en question. On suppose donc
+connues les commandes de less
, qui servent à se déplacer dans les
+pages de man... et la commande servant à chercher un mot. Testez les
+commandes sur des fichiers et répertoires d'essai pour vous faire la main et
+comprendre ce qui se passe.
+
cp
+Oui, c'est à cela que sert l'option -r
(recursive).
+Supposons, suivant l'arborescence d'exemple,
+que vous voulez copier le répertoire Rapport
et ses
+sous-répertoires dans le répertoire www
. Il faut
+taper :
+cp -r Rapport/ www/ ++
+ou +
+ ++cp -R Rapport/ www/ +
tentative/
de son répertoire essai/
, et que
+le répertoire tentative/
existe déjà ?
+
+Quand on indique le nom d'un répertoire qui n'existe pas, cp
+considère qu'il s'agit du nom à donner à la copie du premier répertoire (ou
+fichier). Quand le répertoire existe déjà, cp
considère qu'il
+s'agit de l'endroit où il faut placer la copie du premier élément (la
+«cible» : target).
+Si donc on tape +
++cp -R essai/ tentative/ ++
+et que tentative/
existe déjà, on obtient une copie de
+essai/
, également appelée essai/
, placée dans le
+répertoire tentative/
.
+
+Le programme demande si vous voulez vraiment effacer le fichier déjà existant +pour le remplacer par celui dont vous faites la copie. +
+ + Il en est
+ainsi parce que vous avez un alias de cp
sur cp -i
,
+qui demande confirmation. Ce n'est pas nécessairement le cas partout.
+
&icone.note;Pour savoir quels sont vos
+alias, tapez «alias
» ou allez voir dans votre fichier
+.alias
. Avec la config conscrits, les alias sont dans le
+.zshrc
(le fichier de configuration du shell
+zsh
).
+cp fichier1 fichier2 fichier3 repertoire/ ++ +
+Les fichiers fichier1
, fichier2
et
+fichier3
sont copiés sous leur nom dans le répertoire
+répertoire/
, qui doit exister.
+
mv
+Si vous avez un alias de mv
sur mv -i
(cas de la
+config conscrits), le programme demande si vous voulez réécrire le fichier
+cible en remplaçant son contenu par celui du fichier de départ :
+
+bireme ~ $ ls +rapport.tex notes complements +bireme ~ $mv notes complements +mv: overwrite complements (yes/no)? y +bireme ~ $ls +rapport.tex complements ++
~/Rapport/docs/
.
+
+Rapport.tex
qui
+se trouve dans le répertoire père ?
++mv ../Rapport.tex . ++ +
Amener le fichier Rapport.tex
situé dans répertoire père
+(../Rapport.tex
) dans le répertoire où on se trouve
+(.
: ici).
+
+mv Rapport.tex .. ++ + +
Amener le fichier Rapport.tex
situé dans le répertoire courant,
+dans le répertoire père (..
).
bla/
en blo/
? Que se passe-t-il si le
+répertoire blo
existe déjà ?
+
+
+Il suffit de taper +
+ ++mv bla/ blo/ ++ +
+Si jamais blo/
existe déjà, bla/
devient un
+sous-répertoire de blo/
.
+
+Supposons que l'on veut amener Rapport.tex
dans le répertoire
+courant, et l'appeler stage
. On tape :
+
+mv ../Rapport.tex stage ++ +
+Rapport.tex
est à la fois déplacé et renommé; vous pouvez
+vérifier qu'il n'est plus dans Rapport
et qu'il y a désormais un
+fichier stage
dans docs/
.
+
+Si le fichier d'arrivée existe déjà, on se retrouve dans le cas vu tout au +début de cet exercice (remplacement ou non). +
+Pour déplacer et renommer, la syntaxe est la même que pour un fichier : +
+ ++mv ../bla ble/ ++ +
+déplace le répertoire bla/
du répertoire père dans le répertoire
+courant, et le renomme en ble/
. Si jamais ble/
+existe déjà, bla/
y est déplacé sous son nom, et devient un
+sous-répertoire de ble/
.
+
mv
+avec les options -i
et -f
ensemble ?
+.
+
+
+L'option -f
(force) sert à renommer le fichier
+impérativement, même si le fichier cible existe déjà, sans demander
+confirmation. L'option -i
(interactive) demande
+confirmation. Des deux options, c'est -f
qui l'emporte :
+
+bireme ~ $ ls +bla tutu Rapport/ +bireme ~ $ alias mv +mv='mv -i' +bireme ~ $ mv bla tutu +mv: overwrite tutu (yes/no)? n +bireme ~ $ mv -f bla tutu +bireme ~ $ ls +tutu Rapport/ ++
+ +Il suffit de taper les deux noms de fichiers à la suite; par exemple, pour +visualier bla puis blo, on tape :
+ ++cat bla blo +
+On demande à cat d'afficher le contenu d'un fichier, puis de placer +le résultat dans un fichier :
+ ++cat toto > copie +
+On demande à cat de rediriger sa sortie dans un fichier, puis on n'a +plus qu'à taper le texte et à indiquer la fin du texte avec ^D : +
+ ++galion ~ $ ls +maitrise.tex +galion ~ $ cat > notes +Faire la bibliographie +Revoir le chapitre 1. +^D +galion ~ $ ls +maitrise.tex notes +galion ~ $ cat notes +Faire la bibliographie +Revoir le chapitre 1. +galion ~ $ ++ +
+C'est bien sûr un moyen un peu spartiate pour écrire du texte, mais dans le +cas de choses très courtes dans ce style, ce peut être plus rapide que de +lancer un véritable éditeur. +
cat bla blo > blu
et
+cat bla blo >> blu+ +
+Que se passe-t-il, pour chaque ligne, selon que le fichier blu +existe ou n'existe pas ?
+ + + +cat bla blo > blu
+concatène les deux fichiers bla et +blo, et place le résultat dans un nouveau fichier appelé +blu. Si blu existe déjà, le shell affiche un message +d'erreur et ne fait rien.
+ ++cat bla blo >> blu place la concaténation de bla et +blo à la fin d'un fichier blu déjà existant. S'il n'existe +pas, le shell affiche un message d'erreur et en reste là, sans créer de +fichier blu.
+ ++Les deux redirections ne sont donc pas du tout équivalentes, mais leur action +dépend du shell, qui a des options qui modifie leur comportement par défaut. +
+Il faut utiliser l'option -n de cat. Par exemple : +
+ ++galion ~ $ cat bla +Pomme +Poire +Prune +galion ~ $ cat -n bla > blo +galion ~ $ cat blo + 1 Pomme + 2 Poire + 3 Prune +galion ~ $ +
+Il s'agit de donner le nom des fichiers en indiquant qu'ils commencent par +essai et qu'ils finissent par un chiffre. Il y a en fait plusieurs +façons de faire : +
+ ++Ici, on trouvera tous les fichiers commençant par essai, suivi d'un +unique caractère qui peut ne pas être un chiffre.
++On commande par créer un répertoire C avec mkdir, puis, avec +mv, on déplace tous les fichiers ayant un suffixe . et +dont le nom est fait d'une suite de caractères quelconques : +
+ + ++galion ~ $ ls +hello* zoinx* +hello.c zoinx.c +galion ~ $ mkdir C +galion ~ $ mv *.c C/ +galion ~ $ ls +C/ hello* zoinx* +galion ~ $ ls C/ +hello.c zoinx.c ++
+On commence par créer le répertoire Rangement avec mkdir. +Pour désigner les noms des fichiers, il faut indiquer la notion de +«minuscule». On pourrait écrire explicitement l'alphabet entre crochets, pour +dire «l'un de ces caractères», puis faire de même avec les majuscules. Mais on +gagne du temps en utilisant des intervalles ([a-z] et +[A-Z]). Le reste du nom du fichier, avant et après la minuscule puis +la majuscule, est indéfini. On écrit donc : +
+ + + ++galion ~ $ mkdir Rangement +galion ~ $ mv *[a-z][A-Z]* Rangement/ ++
+Le principe est le même, sauf que l'on indique explicitement les voyelles +entre crochets : +
+ + ++galion ~ $ mkdir Rangement +galion ~ $ mv *[aeiou][aeiou][aeiou]* Rangement/ ++
+On peut procéder de deux façons : utiliser ls seul et des jokers, ou +rediriger ls dans grep et utiliser les expressions +régulières de grep. +
+ +Dans la suite du corrigé, on suppose que l'on se trouve déjà dans +/bin/.
+ +On met des apostrophes autour des expressions de +grep pour les protéger contre le shell. Enfin, on ne détaille pas les +expressions régulières; à noter ces points importants à propos de +grep :
+ + ++On constate que grep est plus complexe mais bien plus puissant que +les jokers du shell. +
+ + ++ | Avec ls seul | +Avec ls et grep | +|
Commence par «a» et dont la deuxième lettre est «s» ou «t» | +ls a[st]* | +ls | grep '^a[st].*' | +|
Contient «un» et se termine par «t» | +ls *un*t | +ls | grep '.*un.*t$' | + +|
Contient «gre» ou «st» | +ls *(gre|st)* | +ls | grep '\(gre\|st\)' | +|
Contient exactement deux lettres «m» | ++ | ls | grep '[^m]*m[^m]*m[^m]*' | +|
Contient au moins deux lettres «m» | ++ | ls | grep '.*m.*m.*' | +|
Contient au moins quatre caractères et aucun chiffre | ++ | ls | grep '^[^0-9]\{4,\}$' | +|
Est constitué de deux lettres exactement | +ls ?? | +ls | grep '^..$' | ++ |
Commence et finit par un chiffre | +ls [0-9]*[0-9] | +ls | grep '^[0-9].*[0-9]$' | +
+Une ligne vide est différente d'une ligne ne contenant +que des blancs, c'est-à-dire des espaces ou des tabulations, même si pour un +oeil humain cela revient au même. La commande de recherche sera différente +selon le cas : +
+grep '^$' fichier
grep '^[[:space:]]$' fichier+
+Pour éliminer toutes les lignes blanches pour un oeil humain, on combine les +deux expressions et on utilise l'option -v qui inverse le sens de la +recherche. On n'a plus qu'à rediriger la sortie dans un fichier. On écrit +donc :
+ +grep -v '\(^[[:space:]]$\|^$\)' fichier1 > fichier2+
+en remplaçant éventuellement le motif par '^$' ou +^[[:space:]]$' selon que l'on veut ôter les lignes vides ou les +lignes contenant des blancs. +
+ + +On cherche la chaîne de caractère «mine», qui soit un mot, éventuellement +suivi d'un «s». On va donc désigner le début du mot avec le symbole +\<, la fin du mot avec le symbole \>, et le «s» +optionnel avec le point d'interrogation. On veut aussi faire apparaître le +nombre d'occurences du mot, dans chaque fichier du répertoire zola, +avec l'option -c de grep.
+ ++Les noms des fichiers de Germinal sont de la forme +zola1.txt, de 1 à 6. Pour chercher dans tous les fichiers de cette +sorte, on peut écrire, au choix (attention à ne pas confondre les +wildcards du shell avec les expressions régulières de grep). +
+ ++On peut donc écrire : +
+ +grep -c '\<mines?\>' *.txt+ + +
Et on obtient :
+ ++zola1.txt:5 +zola2.txt:0 +zola3.txt:3 +zola4.txt:3 +zola5.txt:1 +zola6.txt:2 ++ +
+Attention : les chiffres indiqués correspondent au nombre de lignes où figure +le mot «mine», mais pas au nombre réel d'occurences du mot. Pour un mot précis +comme celui-ci, la marge d'erreur est faible, mais si vous cherchez un article +défini, par exemple, cette méthode est insuffisante. C'est là qu'un langage +comme Perl est très utile. +
+ Une ligne blanche, c'est rien entre un début de ligne +et une fin de ligne, ou alors une ligne ne contenant que des espaces et des +tabulations. On va donc chercher toutes les lignes correspondant à ce schéma +(voir plus haut pour ces questions de définitions). +Comme il y a deux motifs à chercher, on utilise l'expression régulière qui +permet de chercher un motif ou un autre :
+ +\(motif1\|motif2\)+ + + +
+La commande à taper est : +
+ +grep '\(^[[:space:]]$\|^$\)' zola1.txt+ +
+Ensuite, on veut compter le nombre de lignes ainsi produites par +grep, avec la commande wc (word count); on va +utiliser l'option -l (lines, lignes). On tape donc : +
+ +grep '\(^[[:space:]]$\|^$\)' zola1.txt | wc -l+ +
+Et on obtient «81». Bien évidemment, on aurait pu se rappeler que l'option +-c de grep donne le nombre de lignes matchant la chaîne +recherchée, et obtenir le même résultat en ne lançant qu'un seul processus... +
+ +À propos du fichier /etc/hosts : les ordinateurs sur +l'Internet sont désignés par une adresse IP, constituée de 4 nombres entre 0 +et 255 séparés par des points. C'est cette adresse IP qui permet à un +ordinateur d'envoyer un message (datagramme IP) à un autre. +
+ ++Cependant, mémoriser les adresses IP n'est pas commode pour un humain. Pour +cette raison, les ordinateurs ont aussi un «nom», constitué d'un nombre +variable de composantes séparées par des points (par exemple, +research.att.com). +
+ ++Le mécanisme de conversion d'un nom en adresse IP (ou le mécanisme inverse) +s'appelle la «résolution de noms». Elle se fait normalement par +l'intermédiaire de nameservers, ordinateurs sur lequel tourne le +programme BIND, qui se chargent de répondre aux questions de résolution de +noms. +
+ ++Cependant, pour certaines machines très communément accédées depuis un +ordinateur donné (par exemple, les machines de la même salle) ou bien +pour éviter d'avoir à configurer un nameserver, on préfère parfois +utiliser le fichier /etc/hosts : celui-ci définit un certain nombre +de conversions nom -> adresse IP qui seront consultées avant les +nameservers.
+ ++La bibliothèque qui se charge de faire la traduction, et qui consulte d'abord +le /etc/hosts puis les nameservers, s'appelle la +libresolv.
+ + +head -15 /etc/hosts
tail -15 /etc/hosts
tail +15 /etc/hosts
head -20 /etc/hosts | tail -6
+ + +Il y a deux solutions : +
+ +head -9 fichier | tail -5+
tail -8 fichier | head -5+
+On utilise la commande head pour extraire les cinq premières +lignes du fichier, puis la commande tail pour ne conserver que la +dernière des cinq :
+ + +head -5 fichier | tail -1+ + + +
+C'est la commande sort qui permet de trier des fichiers selon un +ordre donné.
+ ++sort sans option trie automatiquement en fonction du premier caractère, +par ordre alphabétique si c'est une lettre, par ordre croissant si ce sont des +chiffres. Il suffit donc de taper : +
+sort fichier+
Pour cela, sans utiliser d'éditeur, on peut +utiliser la commande cut, qui élimine des champs dans une ligne. Par +défaut, le séparateur de champs est une tabulation. Ici, on peut demander à +cut de considérer le slash comme un séparateur de champs (option +-d, «délimiteur»), et de ne conserver que le deuxième champ du +fichier (option -f, field). On redirige ensuite la sortie +dans un autre fichier :
+ +cut -d/ -f2 fichier > fichier2+
sort -r fichier2
+La réponse n'est pas simple, car vous avez également des répertoires de +configuration, comme .netscape/ qui contient entre autres vos +marque-pages (bookmarks.html), vos préférences +(preferences), etc. On va compter le nombre de fichiers commençant +par un point situés dans votre répertoire principal, en éliminant les copies +de sauvegarde (qui finissent par un tilde). Il y a plusieurs manières de +procéder.
+ ++On peut penser à une solution complexe et bien lourde utilisant toutes ces +commandes, ce qui permet de les apprendre plus qu'autre chose... On affiche +une liste longue avec l'ensemble des fichiers (ls -la) puis qui +élimine tous les répertoires et les liens avec grep en ne gardant que +les lignes qui commencent par un tiret :
+ +ls -al | grep '^-'+ +
+Ensuite, on utilise tr pour ne conserver qu'un seul espace entre +chaque champ de la liste, en utilisant l'option -s (squeeze) +qui remplace par une seule occurence la répétition d'un caractère spécifié; on +met des apostrophes autour de l'espace pour qu'il soit compris comme tel et +non comme un simple espace : +
+ +tr -s ' '+ +
+On utilise cut pour conserver le dernier champ avec les noms de +fichiers (en l'occurence le neuvième champ), en indiquant que l'espace sert de +délimiteur de champ :
+ +cut -d' ' -f9+ +
+Enfin, on demande à grep de ne retenir que les fichiers commençant +par un point, et ne finissant pas par un tilde, et on les comptel'option +-c de grep. Cela donne pour finir :
+ +ls -al | grep '^-' | tr -s ' ' | cut -d' ' -f 9 | grep -c '^\..*[^~]$' ++ +
+Mais que de tourments pour si peu... :-) +
Il y a plus simple... On demande à +ls une liste des fichiers commençant par un point (avec l'option +-d pour ne pas descendre dans les répertoires de configuration), on +ne garde que les lignes ne finissant pas par un / ou un tilde, et on +compte :
+ +ls -ad .* | grep -vc '\(~\|/\)$'+
+On demande à find de chercher dans le répertoire courant +(.), sans descendre dans l'arborescence (-maxdepth 1), tous +les fichiers normaux (-type f : file), dont le nom commence +par un point (-name '.*'). On les compte ensuite avec wc : +
+ +find . -maxdepth 1 -name '.*' -type f | wc -l+ +
+Cette solution est préférable car elle ne lance que deux processus et non pas +au moins cinq comme la précédente. +
+ + +Il y a deux solutions, l'une faisant appel à ls et grep, +l'autre faisant appel à find. +
+ ++Le principe est le même que dans l'exercice précédent. La différence est que +grep va chercher les lignes qui commencent par un point +et finissent par un slash. Cela se fait de la manière +suivante :
+ +grep '^\..*/$'+ +
+.* signifie «n'importe quel caractère (point) répété zéro ou +plusieurs fois (étoile)». +
+ ++On tape donc :
+ +ls -ad .* | grep '^\..*/$' | wc -l+ +
+On part ici du principe que vous avez un alias de ls sur ls +-F (qui met un slash après les noms de répertoires, une étoile après les +noms d'exécutables et une arobase après les noms de liens). Si ce n'est pas le +cas, ajoutez-le dans un fichier .alias ou tapez ls -lF. +
+On demande à find de chercher tous les fichiers de type «répertoire» +(-type d : directory), et dont le nom commence par un point +(-name '.*', les quotes servant à protéger du shell le contenu de +l'expression), dans descendre dans l'arborescence. +
+ ++On tape donc :
+ +find . -maxdepth 1 type d -name '.*' | wc -l+
+Il y a une inexactitude dans le résultat : find compte aussi +./ dans le résultat. +
+ +C'est l'option -R de ls qui permet d'afficher +récursivement le contenu d'un répertoire et de ses sous-répertoires (à ne +pas confondre avec -r qui inverse le tri). Pour rediriger la +sortie d'une commande dans un fichier, on utilise le caractère +>. Pour mettre la liste de tous les fichiers de l'arborescence +dans un fichier toto, il faut donc taper :
+ +ls -R > toto+
+Il va s'agir de faire une liste récursive de l'ensemble de votre compte +(option -R de ls), incluant les fichiers de configuration +(option -a) et les renseignements donnés par l'option -l. +
+ ++De la longue liste obtenue, on ne veut retenir que les fichiers, dont les +droits commencent par un tiret (un d identifie les répertoires). On +va donc demander à grep de chercher toutes les lignes commençant par +un tiret. +
+ ++Enfin, on va placer le résultat dans un fichier appelé liste. On tape +donc :
+ +ls -alR | grep '^-' > liste+
+ +L'option -l de ls donne une liste longue des fichiers, +incluant les droits et le type des fichiers, identifiés par une +lettre : rien pour un fichier, «d» pour un répertoire +(directory), «l» pour un lien (link); par exemple : +
+ ++drwxr-xr-x 2 emilia users 1024 mai 10 02:27 www/ ++ +
+Pour obtenir la liste des fichiers du répertoire courant qui sont des liens +symboliques, il suffit donc d'afficher cette liste longue et de ne retenir +que les lignes qui commencent par un «l», grâce à la commande +grep. On utilise une expression régulière pour cela : le +chapeau (^) désigne le début de la ligne, et l'ensemble de +l'expression est placée entre apostrophes pour qu'elle ne soit pas +interprétée par le shell. On tape donc : +
+ + +ls -l | grep '^l'+
+ + +Il faut lancer le man de less, et ensuite chercher dedans le nombre +de lignes contenant le mot file («fichier» en anglais), avec +grep. C'est l'option -c (count) de grep +qui va servir. +
+ ++Finalement, on écrit :
+ +man less | grep -c file+ +
+Et on obtient 205. C'est le nombre de lignes contenant au moins une fois la +chaîne de caractères file, mais pas le nombre d'occurences du mot +dans le fichier : il pourrait y avoir plusieurs fois file sur la même +ligne. On atteint là encore la limite de ce que sait faire grep. +
+Il faut d'abord faire une liste des fichiers avec leurs tailles (option +-l de ls. Ensuite, il faut trier ces lignes en fonction de +la taille, avec la commande sort. Une ligne est de la forme +suivante : +
+ ++-rwxr-xr-x 1 root staff 5872 Jan 21 1994 /usr/bin/rm* ++ +
+C'est le cinquième champ, celui de la taille, qui nous intéresse. La +numérotation commençant à 0 (comme les étages), pour indiquer le cinquième +champ on écrit +4. Ensuite, on veut que le tri se fasse selon un +critère numérique (option -n) et à l'envers, en commençant par les +plus grandes valeurs (option -r, reverse). +
+ ++Pour finir, on veut les dix premières lignes du résultat. On les sélectionne +avec la commande head; par défaut, elle prend les dix premières +lignes d'un fichier, il n'est donc pas nécessaire de préciser le nombre de +lignes voulues. Finalement, on écrit : +
+ +ls -l /usr/bin | sort -nr +4 | head+
Une manière de résoudre cet exercice consiste à utiliser le programme
+sed
qui sert à manipuler du texte.
Nous allons utiliser la commande s
de sed
.
+Sa syntaxe est la
s/regexp/remplacement/
où regexp est une expression régulière et +remplacement un chaîne devant la remplacer.
+ +
+clipper ~ $ cat /etc/hosts | sed -e "s/^.\{4\}\(.\).*/\1/"
+
+Le "^.\{4\}"
du début sert à filtrer les
+4 premiers caractères de chaque ligne. Ensuite, \(.\)
filtre
+n'importe quel caractère, le fait de mettre des parenthèses enregistre le
+caractère en question dans une variable que l'on peut utiliser dans
+la chaîne de remplacement avec "\1"
. Ensuite,
+.*
filtre le reste de la ligne.
+clipper ~ $ cat /etc/hosts | sed -e "s/^.\{4\}\(.\{6\}\)..\(.\).*/\1 \2/"
+
+
+clipper ~ $ cat /etc/hosts | sed -e "s/^.\{14\}//"
+
++Les pages jaunes (yellow pages) sont un système qui centralise +certaines bases de données communes à toutes les machines du système (logins +et noms utilisateurs, mots de passes, groupes d'utilisateurs, noms et adresses +des autres machines sur le réseau) sur un petit nombre de serveurs redondants; +cela permet de garder des bases de données cohérentes, plus facilement que si +on devait mettre à jour leur contenu sur plusieurs centaines de machines à la +fois. +
+ ++On dit plutôt aujourd'hui NIS ou Network Information System, Yellow Pages +étant une marque déposée de British Telecom.
+ ++La commande ypcat permet de visualiser une base de données: citons en +particulier: ypcat passwd, ypcat group, ypcat +hosts.
+ ++Ces bases de données sont les versions centralisées des fichiers +/etc/passwd, /etc/group et /etc/hosts, lesquels ne +contiennent alors plus que quelques informations; par exemple, le fichier +/etc/hosts contient tout de même des adresses de machines, ne +serait-ce que celle du serveur de pages jaunes.... +
+ ++ +Pour avoir une liste de tous les comptes, on tape
+ +ypcat passwd+ +
+On veut ensuite sélectionner les gens dont le répertoire personnel contient +/96/, et dont le login commence par l, et compter le nombre +de lignes (option -c de grep). On tape donc :
+ +ypcat passwd |grep c '^l.*/96/'+
+et on obtient 19. +
++ +On veut savoir si des chemins d'accès de répertoires personnels sont de la +forme
+ +/users/8[0-9]+ +
+On tape donc : +
+ +ypcat passwd | grep '/users/8[0-9]'
+ +On veut avoir une liste des gens dont le chemin d'accès du répertoire +personnel commence par /users/ et un numéro : /users/9[0-9] +(puisqu'on vient de voir qu'il n'y a pas de gens des promotions antérieures). +On utilise l'option -c (count) pour avoir le nombre de +personnes :
+ +ypcat passwd | grep -c '/users/9[0-9]/'+
+ + +Le numéro d'ID (user identification) identifie les utilisateurs, les +numéros les plus bas correspondant au système (l'UID de root est 0). C'est le +troisième champ, les champs étant séparés par des deux-points. +
+ ++On va utiliser sort pour trier, selon un critère numérique (option +-n). Par défaut, avec sort les champs sont délimités par des +blancs, il faut donc indiquer qu'ici ce sont des deux-points, avec l'option +-t. Enfin, on trie en fonction du troisième champ (2, +la numérotation commençant à 0).
+ ++On suppose aussi que l'on veut pouvoir lire le résultat du tri avec +less. On tape donc :
+ +ypcat passwd | grep '/users/9[0-9]' | sort -n -t: +2 | less+
grep
pour ne garder que les lignes des pages
+jaunes correspondant aux personnes ayant zsh
comme shell de
+login et on utilise sed
pour n'afficher que le login :
+
+bireme ~ $ ypcat passwd | grep "zsh$" | sed -e "s/:.*//"
+
+clipper
, tout le
+monde à /bin/sh
comme shell de login. Le shell (en général
+zsh
) n'est lancé qu'à partir du script
+.profile
. Il s'agit d'un choix de l'administrateur système.
+
+bireme ~ $ ypcat passwd | sed -e "s/:\/.*//
+s/.*://" | grep " .*[aeiou][aeiou].*"
+
++C'est la commande df qui donne des informations sur le disque et sur +les partitions montées. Pour rediriger la sortie d'une commande dans un +fichier, on utilise l'opérateur de redirection > suivi du nom du +fichier. Dans notre cas, pour conserver les informations dans un fichier +appelé disque, on écrira : +
+ ++df > disque +
+C'est la commande finger qui donne des renseignements sur les +utilisateurs. Si on tape +
+ ++finger martin ++ +
+ou mieux (plus rapide), +
+ ++finger -m martin ++ +
+les renseignements concernant l'utilisateur s'affichent. On y trouve la +date de son dernier login sur la machine où vous êtes, ainsi que la date de la +dernière fois où il a lu son courrier (mais ce à condition qu'il ait reçu du +courrier depuis...). +
+C'est la commande file qui permet d'afficher le type des fichiers. +Dans notre cas, il suffit d'écrire: +
+ ++galion ~ $ file /etc/passwd /usr/include/stdio.h /bin/ls . +/etc/passwd: ASCII text +/usr/include/stdio.h: C program text +/bin/ls: ELF 32-bit MSB executable, SPARC, version 1, stripped +.: directory +galion ~ $ ++
find
Ces exercices sont des questions de cours : les solutions se trouvent
+toutes dans les pages de man des commandes en question. On suppose donc
+connues les commandes de less
, qui servent à se déplacer dans les
+pages de man... et la commande servant à chercher un mot. Testez les
+commandes sur des fichiers et répertoires d'essai pour vous faire la main et
+comprendre ce qui se passe.
+
find
+
+
+C'est l'option -name
qui permet de spécifier le nom du ou des
+fichiers recherchés. On peut indiquer le nom d'un fichier complet
+(bofichier.tex
), ou utiliser des expressions régulières (celles du
+shell, pas celles de grep
...) :
*
) désigne «un ou plusieurs caractères»;
+Dans notre cas, le premier caractère est un «a» ou un «A» ([aA]
),
+suivi de quelque chose (*
) et terminé par un chiffre entre 3 et 6
+([3456]
ou [3-6]
). On écrit donc :
+
+find . -name '[aA]*[3-6]' -print ++
+C'est l'option -mtime
qui permet de donner une indication en
+jours. La syntaxe varie selon ce que l'on souhaite :
+
-mtime 30
: le fichier a été modifié il y a 30
+jours;-mtime +30
: le fichier a été modifié il y a 30
+jours ou plus;-mtime -30
: le fichier a été modifié il y a 30
+jours ou moins.
+
+On utilise l'option -newer
(«plus récent»). Par exemple, on
+cherche un fichier .tex
modifié plus récemment que
+bofichier.tex
:
+
+find . -newer bofichier.tex -name '*.tex' ++ + +
+On peut raffiner la demande, en combinant cette option avec l'option
+-mtime
: cherchons les fichiers modifiés plus récemment que
+bofichier.tex
, mais il y a plus de 5 jours :
+find . -newer bofichier.tex -mtime +5 -name '*.tex' +
+On utilise l'option -type
pour spécifier le genre de fichier
+recherché : les principaux sont f
(file) pour un
+fichier normal, et d
(directory) pour un répertoire.
+On tape donc :
+
+find . -type d ++
+
+On utilise l'option -size
, suivie d'un nombre et d'une lettre
+indiquant l'unité de mesure (c
: octets,
+k
: kilo-octets). Comme pour -mtime
, on
+utilise +
, -
ou [rien]
pour indiquer
+que la taille est, respectivement, supérieure, inférieure ou égale à la valeur
+donnée.
+Par exemple, on recherche un fichier modifié il y a moins de 12 jours et dont +la taille soit supérieure à 30 K :
+ ++find . -type f -size +30k -mtime -12 -print +
+ + +La ligne utilisée pour trouver ces fichiers et la suivante : +
+ ++find . -mtime +30 -name '*~' ++ +
+Il y a deux façons de faire exécuter des commandes sur les fichiers trouvés
+par find
: utiliser l'option «-exec
+commande», ou utiliser un pipe avec xargs
.
+
-exec
commande exécute la commande
+sur le fichier courant. La commande est terminée par le marqueur
+;
, qu'il faut protéger du shell avec un backslash. Le fichier
+courant est désigné par la chaîne {}
.
+
++Pour effacer tous les fichiers de sauvegarde vieux de plus d'un mois, on tape +donc :
+ ++find . -mtime +30 -name '*~' -print -exec rm \; ++ + +
+On peut faire exécuter la commande de façon interactive en remplaçant
+-exec
par -ok
:
+find . -mtime +30 -name '*~' -print -ok rm \; ++ +
+Le programme demande, pour chaque fichier trouvé, si on veut bien exécuter la
+commande; la réponse doit être «y
» ou «Y
».
+
-exec
est en fait très lourde, car elle
+crée un nouveau processus pour chaque fichier; il vaut mieux
+rediriger le résultat de find
avec un pipe et
+xargs
. Dans notre cas, on tapera donc :
+
+
++find . mtime +30 -name '*~' | xargs -p rm ++ +
+L'option -p
de xargs
rend cette commande
+interactive. Il faut répondre «y
» ou «Y
» pour
+confirmer.
+
+Quelle différence y a-t-il entre un simple pipe et
+«| xargs
» ? Pour la comprendre, voici un
+exercice : cherchez tous les fichiers contenus dans
+/usr/local/lib/texmf/tex
et cherchez dedans le mot «supertab». Il
+y a deux solutions :
+
+find /usr/local/lib/texmf/tex -type f | grep supertab ++ +
+Vous obtenez une liste de fichiers contenant «supertab» dans leur nom. +
++find /usr/local/lib/texmf/tex -type f | xargs grep supertab ++ +
+grep
cherche dans chaque fichier passé en argument la chaîne de
+caractères «supertab», ce qui est très différent...
grep
: corrigés
+Ces exercices sont des questions de cours : les solutions se trouvent
+toutes dans les pages de man des commandes en question. On suppose donc
+connues les commandes de less
, qui servent à se déplacer dans les
+pages de man... et la commande servant à chercher un mot. Testez les
+commandes sur des fichiers et répertoires d'essai pour vous faire la main et
+comprendre ce qui se passe.
+
grep
grep
+qui permettent d'obtenir des lignes de contexte (qui précèdent et/ou suivent
+la ligne où figure le mot) ? + +Il y en a plusieurs, qui se recoupent :
+ +-num
: le numéro indique le nombre de
+lignes de contexte que l'on veut voir figurer avant et après la ligne où
+figure le mot recherché. Par exemple, si on veut trois lignes de contexte,
+avant et après la mot (soit sept lignes au total), on tape :
+
++grep -3 ... ++
-A num
(after) : le numéro
+indique le nombre de lignes qui doivent suivre la ligne où figure le mot. Si
+on en veut quatre, on tapera :
+
+
++grep -A 4 ... ++
-B num
(before) : le
+numéro indique le nombre de lignes qui doivent précéder la ligne où
+figure le mot. Si on en veut dix, on tape :
+
++grep -B 10 ... ++
-C
(context), qui donne deux lignes de contexte
+avant et après. En fait, les trois lignes suivantes sont strictement
+équivalentes :
++grep -2 ... +grep -C ... +grep -A 2 -B 2 ... ++
+C'est l'option -n
(number) qui sert à cela; le numéro
+figure tout au début de la ligne, suivi d'un deux-points (:
) et
+du texte. Par exemple :
+bireme ~ $ grep -n violon verlaine.tex
+12:des violons de l'automne
+
++Quand on fait une recherche dans plusieurs fichiers, le nom du fichier figure +d'abord, puis le numéro de la ligne, et enfin le texte, le tout séparé par des +deux-points. Par exemple : +
+ +
+bireme ~ $ grep -n violon *
+verlaine.tex:12:des violons de l'automne
+orchestre:45:Cordes : contrebasse, violoncelle, alto, violons.
+
+
+Que se passe-t-il quand on demande également des lignes de
+contexte ?
+
+La disposition générale ne change pas, par contre, le signe utilisé pour
+séparer la ligne de son numéro est un tiret (-
) quand il s'agit
+des lignes de contexte, et un deux-points quand il s'agit de la ligne voulue.
+Par exemple :
+bireme ~ $" grep -nC violon verlaine.tex
+10-
+11-Les sanglots longs
+12:des violons de l'automne
+13-bercent mon coeur
+14-d'une langueur monotone
+
+
+
+On utilise l'option -c
(count) :
+
+bireme ~ $ grep -c violon *
+verlaine.tex:1
+orchestre:1
+
+grep
+ignore la casse des caractères (différence entre majuscules et minuscules)
+dans sa recherche ?
+
+Par défaut, grep
fait la différence entre les majuscules et les
+minuscules; pour invalider ce comportement, on utilise l'option
+-i
(ignorecase).
+C'est l'option -l
qui permet de faire cela : afficher les
+noms des fichiers où figure au moins une fois la chaîne de caractères
+recherchée.
+On veut en fait inverser le sens de la recherche : c'est l'option
+-v
qui fait cela.
+
+On utilise l'option -L
, qui affiche les noms de fichiers où ne
+figurent pas la chaîne de caractères recherchée. Il ne faut bien sûr pas
+confondre les options -l
et -L
...
+
grep
ne
+recherche que les lignes où figure le mot tel quel, et non pas ses
+variantes ?
+
+C'est l'option -w
(comme word) qui sert à cela : un
+mot complet est délimité comme suit :
+
+Si donc on veut chercher «travail» et aucune forme dérivée de ce mot, on +écrit : +
+ ++grep -w travail mon-fichier ++
+On veut chercher toutes les occurences des mots «terre» et «ciel» dans les
+deux premiers chapitres de la première partie de Germinal, avec les
+numéros des lignes. On propose deux solutions, la première utilisant les
+ressources de la syntaxe de grep
, la seconde utilisant l'option
+-f
avec un fichier.
grep
: La structure
+\(mot1\|mot2\)
permet de chercher plusieurs mots. Ici, on tape la
+ligne suivante :
+
++grep '\(ciel\|terre\)' fichier ++ +
+On met des apostrophes de part et d'autre de l'expression pour la protéger +contre le shell, c'est-à-dire pour que le shell ne cherche pas à interpréter +l'expression. +
-f
fichier» : dans un
+fichier quelconque, que nous appellerons liste
, on indique les
+mots que l'on recherche : «ciel» et «terre». Chaque ligne correspond à un
+mot recherché. Il ne faut donc pas mettre de ligne comme
+
++terre ciel ++ + +
+car le programme chercherait la chaîne de caractères «terre ciel», qui est +assez improbable en français. Il ne faut pas non plus laisser de ligne +blanche : le programme afficherait l'ensemble du texte. +
+
+Quelle que soit la solution retenue, on veut ensuite afficher le numéro des
+lignes (option -n
); d'autre part, pour que la recherche soit
+exhaustive, il vaut mieux que grep
ne fasse pas de différence
+entre les majuscules et les minuscules, avec l'option -i
+(ignore case, ignorer la casse des caractères). Il faut aussi décider
+si on cherche les mots tels quels, sans leurs variantes (comme «terre» au
+pluriel), ou si on accepte ces variantes. Si on ne veut que le mot sans ses
+dérivés, on utilise l'option -w
.
+
+Pour désigner les deux fichiers où faire la recherche, on peut les écrire +littéralement : +
+ ++zola1.txt zola2.txt ++
+ou, mieux, utiliser les joker du shell : +
++zola[12].txt ++ +
[12]
signifie «le caractère 1 ou le caractère 2».
+Finalement, on peut taper, au choix :
++grep -inw -f liste zola1.txt zola2.txt +grep -inw -f liste zola[12].txt +grep -inw '\(ciel\|terre\)' zola1.txt zola2.txt +grep -inw '\(ciel\|terre\)' zola[12].txt ++ +
+Et on obtient : +
+ ++zola1.txt:13:ciel, le pavé se déroulait avec la rectitude d'une jetée, au +milieu de +zola1.txt:36:brûlaient si haut dans le ciel mort, pareils à des lunes fumeuses. +Mais, au +zola1.txt:50:besogne. Les ouvriers de la coupe à terre avaient dû travailler +tar d, on +zola1.txt:124:terre, lorsqu'un accès de toux annonça le retour du charretier. +Le ntement, +zola1.txt:191:bleues en plein ciel, comme des torches géantes. C'était d'une +tristesse +zola1.txt:207: Le manoeuvre, après avoir vidé les berlines, s'était assis à +terre, +zola1.txt:222:fois avec tout le poil roussi, une autre avec de la terre jusque +dans le + +(...) ++ +
+Le résultat est un peu différent quand on n'utilise pas l'option
+-w
.
+grep
recherche des chaînes de caractères, qui peuvent être un mot
+complet («terre»), une suite de lettres («tre»), ou une expression régulière.
+Les expressions régulières sont des formules qui représentent des chaînes de
+caractères. On cherche alors non pas un mot précis, mais des suites de
+caractères correspondant aux critères demandés. Elles sont d'un usage fréquent
+avec grep
bien sûr, mais aussi avec des commandes comme
+less
, ou encore au sein d'un éditeur.
+
+«Expressions régulières» (Regular expressions en anglais) se +traduisent en bon français par «expressions rationnelles», mais l'usage est de +dire «régulières». +
+ ++Ces exercices n'entendent pas remplacer un cours sur les expressions +régulières, ni faire le tour de leurs possibilités. +
+ ++Il faut indiquer que l'on veut le début de la ligne, avec le chapeau +(caret en anglais). Ensuite, on veut préciser que la ligne commence +par un «a» minuscule ou majuscule. Il y a deux façons de le faire : +
+ +-i
qui fait ignorer la différence entre
+les majuscules et le minuscules.[abc]
signifie «a ou b ou c». Ici, ce sera
+[aA]
.+Enfin, il faut protéger les signes contre le shell, pour qu'il ne les +interprète pas; on met donc l'expression entre apostrophes. Remarque : +la protection des expressions régulières contre le shell est une question +complexe.... +
+ ++Il faut donc écrire : +
+ ++grep -i '^a' fichier ++ +
+ou +
+ ++grep '^[aA]' fichier ++
+
+
+C'est le dollar ($
) qui représente la fin de la ligne. Il faut
+donc écrire :
+grep 'rs$' fichier +
+
+
+Pour désigner un chiffre, on peut en indiquer une liste entre crochets :
+[0123456789]
. Il est plus simple d'utiliser une classe de
+caractères : [0-9]
qui désigne, comme la solution précédente,
+n'importe quel chiffre de zéro à neuf.
+
+Il faut donc taper :
++grep '[0-9]' fichier ++
+
+
+Comme on l'a vu, c'est le chapeau qui indique le début de la ligne. Pour
+indiquer que l'on cherche une majuscule, on peut soit en donner une liste
+([ABCDEFGHIJKLMNOPQRSTUVWXYZ]
), soit utiliser une classe de
+caractères : [A-Z]
, la seconde solution étant, de loin,
+préférable...
+
+Il faut donc taper : +
++grep '^[A-Z]' fichier ++
+ + +Il faut indiquer entre crochets les trois lettres recherchées : +
+ ++grep '^[BEQ]' fichier ++
+
+
+Le point d'exclamation n'a pas de signification particulière avec
+grep
, on peut donc le mettre tel quel :
+
+grep '!$' fichier ++
+ + +Il faut donner une liste de caractères, que l'on ne veut pas voir figurer; la +liste sera entre crochets, comme on l'a déjà vu, et c'est le chapeau qui +signifiera, dans ce contexte, «sauf». Par exemple, si on cherche tous les «a», +sauf ceux suivi de «b», «c» ou «t», on écrit : +
+ ++grep 'a[^bct]' ++ + +
+Il y a une seconde difficulté, qui vient de ce que certains caractères sont
+spéciaux avec grep
. Vous vous doutez que le chapeau est spécial
+quand il est placé au début de l'expression, et que le dollar l'est quand il
+est placé en fin d'expression. Dans notre cas :
+
egrep
, il fonctionne tout seul, avec
+grep
, il faut le faire précéder d'un backslash pour qu'il
+fonctionne; par exemple (avec grep
), pour chercher «charbon» ou
+«vagabond», on écrit :
++grep 'ar?bo' fichier ++ +
+(chercher la suite de lettre «abo» avec un «r» facultatif entre le «a» et le +«b»).
+
+Pour que grep
interprète littéralement ces caractères, et ne les
+considère plus comme spéciaux, il faut les faire précéder d'un backslash
+(\
). Si par exemple vous cherchez toutes les lignes qui se
+terminent par un point, il faut taper :
+
+grep '\.$' fichier ++ + +
+Dans notre cas cependant, ces caractères sont protégés par les crochets. On +peut donc écrire : +
+ ++grep '[^.,;:?!]$' fichier ++ + +
+On peut aussi utiliser l'option -v
, qui prend toutes les lignes
+où ne figure pas une chaîne de caractères donnée; dans ce cas, on tape :
+
+grep -v '[.,;:?!]$' fichier ++
+
+On cherche une chaîne de caractères qui soit indifféremment au début ou au
+milieu d'un mot. N'importe quelle lettre, ce sont les classes de caractères
+[a-zA-Z]
ou [:alpha:]
, qui sont équivalentes.
+
+Il y a une petite subtilité avec l'emploi de classes du second type; elles +désignent un groupe de caractères, et il faut mettre une seconde paire de +crochets pour dire «n'importe quel caractère de cette classe prédéfinie». +On tape donc au choix : +
+ ++grep '[a-zA-Z]r' fichier' ++
+ou +
++grep '[[:alpha:]]r' fichier' ++ + +
+Attention, dans ces listes ne sont pas compris les caractères accentués... +
+C'est le symbole \<
qui désigne un début de mot. La première
+lettre du mot est indifférente, la seconde est un «r». On écrit donc :
+
+grep '\<.r' fichier ++ + +
+Il y a cependant un problème avec les caractères accentués, que
+grep
considère comme des blancs. Dans ce cas, il vaut mieux
+procéder autrement : un mot est précédé d'un début de ligne, ou d'un
+blanc ou d'une tabulation. Un début de ligne, c'est le chapeau, un blanc ou
+une tabulation, c'est la classe de caractères [:space:]
.
+
+On va se servir du pipe (|
) qui signifie «ou». Avec
+grep
, il faut backslasher le pipe, avec egrep
ce
+n'est pas nécessaire. On écrit donc (avec grep
) :
+
+grep '^.r|[[:space:]].r' fichier ++ +
+Ce n'est quand même pas si simple; les mots peuvent être précédés d'un tiret
+(mots composés), d'une apostrophe, de guillemets divers (``
,
+"
, «
, <<
), et, si l'auteur du
+texte n'est pas respectueux des règles de typographie, d'une ponctuation. Il y
+a donc bien des cas à envisager...
+
less
+On aborde ici less
, qui est une version plus élaborée de
+more
; ce dernier est toujours détaillé dans dans les ouvrages sur
+Unix, et de fait il est toujours présent sur ces systèmes, ce qui n'est pas
+forcément vrai pour less
(qui est quand même très courant).
+more
est beaucoup plus rudimentaire, alors que less
+a beaucoup de fonctionnalités appréciables : vidéo inverse pour les
+motifs recherchés, déplacements en avant et en arrière pour la recherche, etc.
+
less
?
+
+On tape h
ou H
pour afficher une page d'aide. On s'y
+déplace comme dans less
(flèches, ^D
,
+^F
, ^B
, ^P
, SPC
,
+j
, k
...). Pour quitter l'aide, ce sont les mêmes
+commandes que pour quitter less
: q
,
+Q
, :q
, :Q
, ZZ
.
+
+Il suffit de donner plusieurs fichiers en argument à la commande
+less
; par exemple, pour examiner sucessivement les fichiers
+toto
, bla
et blu
, on tape :
+
+less toto bla blu ++ +
+Pour passer au fichier suivant, on tape :n
(next); pour
+revenir au fichier précédent, on tape :p
(previous).
+:x
permet de revenir au premier fichier spécifié.
+
less
?
+
+Ce sont : q
, Q
, :q
, :Q
,
+ZZ
.
+
less
d'ouvrir le
+fichier en plaçant en haut de l'écran la ligne n ?
+
+
+
+On spécifie le numéro de la ligne après le signe +
; par exemple,
+pour ouvrir le fichier rapport
sur la ligne 57, on tape :
+
+less +57 rapport ++
less
d'ouvrir le
+fichier en plaçant en haut de l'écran la première ligne où apparaît un motif
+donné ?
+
+
+On utilise l'option -p
de la commande less
; par
+exemple, pour chercher le mot «toto» dans le fichier rapport
, on
+tape :
+
+less -p toto rapport ++ +
+On peut aussi indiquer le motif recherché de la façon suivante : +
++less +/toto rapport ++
less
qui permettent de chercher un motif dans un fichier,
+respectivement après et avant la position courante ?
+
+
+Pour chercher un motif plus en avant dans le texte, on utilise le slash (barre
+oblique vers la droite : /
). Par exemple :
+
+/mot ++ + +
+Pour chercher en arrière de la position courante, on utilise le point
+d'interrogation. Pour aller à la prochaine occurence du mot, il suffit de
+taper n
(next). Pour aller à la précédente occurence du
+mot, il faut taper N
. Évidemment, quand on cherche un motif avec
+?
, n
remonte dans le texte et N
+descend dans le texte.
+Une fois le début ou la fin du fichier atteint, la recherche s'arrête. On +peut utiliser les expressions régulières. +
less
de chercher le
+mot à partir de la première ligne du fichier, et ce où que l'on soit dans le
+fichier ?
+Il faut taper ^F
après avoir tapé /
. En fait,
+^F
fait commencer la recherche au premier fichier dont on a donné
+le nom; quand il n'y en a qu'un seul, cela place de fait tout au début du
+fichier. Par exemple, pour chercher toto
alors qu'on se trouve à
+la fin du fichier, on tape :
+/^F ++ +
+Le prompt devient alors : +
+ ++First-file / ++
+et il n'y a plus qu'à taper le motif recherché. +
-i
à
+less
? Quelle option faut-il mettre à la place de
+-i
pour chercher toTo
tout en ignorant la casse des
+caractères ?
+
+L'option -i
signifie ignorecase, c'est-à-dire ignorer la
+casse des caractères (différence entre majuscules et minuscules). Si donc
+je tape (au choix) :
+
+less -ip TOTO rapport +less -ip toto rapport +less -i +/toto rapport +less -i +/TOTO rapport ++ +
+less
ne fera pas la différence entre les majuscules et les
+minuscules, et je trouverai toto
comme TOTO
. Bien
+sûr, c'est la même chose si je lance less
avec l'option
+-i
et que je cherche ensuite le mot à l'intérieur du fichier avec
+/
ou ?
.
+
+Mais l'option -i
est invalidée si le motif
+recherché contient des majuscules et des minuscules : si, en
+lançant less
comme ci-dessus, je cherche le motif
+Toto
, je ne trouverai que Toto
et pas
+TOTO
par exemple. Pour contourner cette restriction, il faut
+lancer less
avec l'option -I
, qui est donc un
+ignorecase «robuste».
+
+Pour aller à l'occurence suivante (resp. précédente) d'un motif dans un
+fichier, on utilise n
(resp. N
). Pour faire la même
+opération mais sans passer manuellement de fichier en fichier, on tape
+ESC n
pour chercher en avant, et ESC N
pour chercher
+en arrière. ESC
désigne bien sûr la touche d'échappement
+(Escape
).
+
/
?
+Le caractère /
sert à chercher un mot dans le fichier. Si on tape
+
+// ++ +
+less
répond : Pattern not found
. Il faut donc
+dire à less
de considérer le /
comme un caractère
+ordinaire, et pas comme un caractère spécial. Comme avec toutes les
+expressions régulières, c'est le backslash (barre oblique vers la
+gauche : \
) qui sert à cela. Pour chercher un
+/
, on tape donc :
+
+/\/ ++ +
La page de man donne une liste de caractères qui sont spéciaux avec
+/
et ?
. Ces commandes de recherche utilisent les
+expressions régulières de ed
(et de vi
par
+conséquent).
+
ls
Ces exercices sont des questions de cours : les solutions se trouvent
+toutes dans les pages de man des commandes en question. On suppose donc
+connues les commandes de less
, qui servent à se déplacer dans les
+pages de man... et la commande servant à chercher un mot. Testez les
+commandes sur des fichiers et répertoires d'essai pour vous faire la main et
+comprendre ce qui se passe.
/usr/local/games/bin
+
++ls /usr/local/games/bin ++ +
Vous obtenez une liste des jeux installés.
.flnewsrc.forum
?
+
+
+ls -al .flnewsrc.forum+ + +
+L'option -a
fait apparaître les fichiers de configuration, qui
+commencent par un point; l'option -l
affiche plusieurs
+renseignements, en particulier la taille. En fait, si vous indiquez le nom
+complet du fichier cherché, avec le point, l'option -a
est
+inutile; c'est le cas ici.
+
+Le .flnewsrc.forum
contient la liste de continua de forum avec
+des indications sur les contis auxquels vous êtes abonnés et les messages que
+vous avez déjà lus. Il est remis à jour à chaque fois que vous lisez
+forum : la date indiquée correspond donc à la dernière fois que vous avec
+lancé (ou plus précisément, quitté...) forum.
+
-R
de
+ls
?
+
+Cette option permet d'afficher une liste récursive, c'est-à-dire qui indique
+le contenu des répertoires listés, ainsi que de leurs sous-répertoires. Si
+vous tapez ls -R
dans votre répertoire personnel, vous aurez une
+liste de tout ce que vous avez chez vous.
+Pour savoir cela, il faut chercher le mot sort dans le man de
+ls
. La première occurence vous dit que par défaut le résultat est
+trié par ordre alphabétique, selon la première lettre des fichiers. De façon
+plus précise, l'ordre est le suivant : ponctuations, chiffres,
+majuscules, minuscules, selon l'ordre défini par la table des caractères
+ASCII.
+En continuant à chercher, vous trouvez des options intéressantes :
+-r
(reverse), qui inverse l'ordre de classement,
+-t
(time) qui trie en fonction de la date de dernière
+modification.
+ls -t ++
+si vous voulez juste modifier le critère de tri, sans plus de renseignements; +ou encore
+ls -lt+
+si vous voulez une longue liste. +
Mail
? Qu'est-ce que cela signifie ?
+
+
++La ligne ressemble à ceci : +
+ ++drwx------ 2 toto litt98 512 Apr 2 19:02 Mail ++ +
+Le d
indique qu'il s'agit d'un répertoire (directory).
+Suivent ensuite neuf caractères, allant par trois; r, w, x
+correspondent aux droits que vous avez sur le répertoire (ou le
+fichier) : r
(read) pour le droit de lecture,
+w
(write) pour le droit d'écriture, x
+(execute) pour le droit d'exécution.
+
+Les six tirets qui suivent correspondent aux droits qu'ont le groupe (ici
+litt98
) puis le reste des utilisateurs. Ici il y a des tirets, ce
+qui signifie qu'ils n'ont aucun droit sur ce répertoire.
+
+Cela veut dire que seul le propriétaire a le droit de lire et écrire dans son
+répertoire Mail/
, ainsi que d'y accéder. Les répertoires et les
+fichiers de courrier sont protégés contre les indiscrétions.
+
+Un fichier de texte standard a les droits suivants : +
+ ++-rw-r--r-- ++ + +
Il y a un tiret tout au début, ce qui signifie que c'est un fichier
+normal; vous avez le droit d'écrire et de lire (rw-
), votre
+groupe et les autres utilisateurs ont le droit de lire le fichier
+(r--
). La commande chmod
permet de
+changer ces droits, si l'on veut restreindre la lecture, ou rendre un
+fichier exécutable.
+Remarque : ne cédez pas à la paranoïa... vos camarades ne passent pas +leur temps à farfouiller sur les comptes des voisins, donc vous n'avez pas +besoin d'interdire à la lecture tout ce que vous avez chez vous. +
ls -l
.
+
++-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux ++ +
Les dix premiers caractères détaillent les droits du fichier. Le premier +caratère identifie le type du fichier : ici, rien n'est spécifié, c'est +donc un fichier normal. L'exercice précédent détaille la signification des +lettres suivantes. Ce sont les droits normaux d'un fichier standard : +tout le monde (propriétaire, groupe et autres utilisateurs) peut lire le +fichier, seul le propriétaire peut écrire dedans. +
++-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux ++ +
+Le chiffre indique le nombre de liens. Nous vous renvoyons aux exercices sur +les liens pour plus d'explications (qui peuvent attendre à un niveau +débutant...). +
+-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux ++
+Le troisième champ donne le nom du propriétaire du fichier. Ici, il s'agit de
+l'utilisateur robin
.
+-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux ++ +
+Ce champ indique le groupe de l'utilisateur. Ici, nous apprenons qu'Émilia est +une littéraire de la promotion 1995. +
+-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux ++ +
+Ce chiffre donne la taille en octets du fichier considéré. Ici, le fichier +fait 754 octets, soit moins d'un Ko (1000 octets). C'est un petit fichier. +
+ ++-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux ++ + +
Ce champ indique la date de dernière modification du fichier, ici le 22 mars +de l'année courante, à 11h59. Quand le fichier date d'une année antérieure, +celle-ci est indiquée et l'heure ne figure plus.
+ ++-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux ++
+Vient enfin le nom du fichier. Le suffixe .aux
montre qu'il s'agit
+d'un fichier produit par LaTeX lors de la compilation d'un fichier
+projet.tex
.
+Si on tape +
+ ++ls -l repertoire/ ++ +
+c'est le contenu du répertoire qui s'affiche, et pas son statut à lui.
+L'option -d
(directory) permet de lister le répertoire
+lui-même.
+
+Ce sont les caractères suivants : +
+ + +slash | +(/ ) |
+pour un répertoire | +
arobase | +(@ ) |
+pour un lien symbolique | +
étoile | +(* ) |
+pour un exécutable | +
pipe | +(| ) |
+pour un pipe nommé | +
égal | +(= ) |
+pour un socket | +
+C'est l'option -F
qui permet de les afficher.
+
+Avoir le droit d'«exécuter» un répertoire, c'est avoir le droit d'y accéder, +de s'y déplacer; mais je n'ai pas le droit de «lire» son contenu. Donc, à +moins d'en être propriétaire, je ne peux pas afficher le contenu d'un +répertoire ayant comme droits : +
+ ++drwx--x--x ++
mkdir
, rmdir
, cd
)
+Ces exercices sont des questions de cours : les solutions se trouvent
+toutes dans les pages de man des commandes en question. On suppose donc
+connues les commandes de less
, qui servent à se déplacer dans
+les pages de man... et la commande servant à chercher un mot. Testez les
+commandes sur des fichiers et répertoires d'essai pour vous faire la main et
+comprendre ce qui se passe.
mkdir, rmdir
+Si vous voulez créer trois répertoires bla
, ble
et
+bli
, tapez
+
+mkdir bla ble bli +
+Il faut taper +
+ ++rmdir bla ble bli +
mkdir
+mkdir
?
+
+Vous créez chez vous un répertoire appelé mkdir
.
bla/
... mais ça ne marche pas.
+
+
+ls
vous dit qu'il est vide, et pourtant vous ne réussissez pas à
+l'effacer : c'est qu'il n'est pas vide. Il doit y avoir des fichiers
+cachés, commençant par un point, que vous ne voyez pas avec ls
+sans option. Il faut taper
+
+ls -a ++
+et effacer les fichiers trouvés. +
mkdir
peut prendre des
+options ?
+
+Oui, une : l'option -p
, dont on va parler tout de suite.
+
mkdir Rapport/annexes
» peut fonctionner et créer effectivement
+ce sous-répertoire ?
+
+
+Il faut que le répertoire Rapport
existe, pour que l'on puisse y
+créer un sous-répertoire.
+
mkdir
qui
+permette de créer à la fois un répertoire et un sous-répertoire de ce
+répertoire ?
+
+
+Oui, c'est l'option -p
. Quand vous tapez
+
mkdir -p Rapport/annexes ++ +
+un répertoire Rapport
est créé, et dans ce répertoire un
+sous-répertoire annexes
.
+
+On utilise l'option -m
(mode) de mkdir
.
+Par exemple :
+
+bireme ~ $ mkdir -m 700 Mail +bireme ~ $ ls -ld Mail +drwx------ 2 robin litt95 2048 Jun 2 15:27 Mail/ +
rmdir -p toto/tata/tutu/+ +
+Cette commande efface toute la hiérarchie des répertoires, à condition qu'ils
+soient vides; si par exemple tutu/
est vide mais
+toto/
ne l'est pas, tutu/
sera effacé mais pas
+toto/
, et le programme s'arrête.
+
+On achève avec ceci le tour de l'option -p
... Si donc on tape
+
+mkdir -p toto/tutu/ ++
+le sous-répertoire tutu/
est créé si toto/
existe
+déjà; et si toto/
n'existe pas, ce répertoire et son
+sous-répertoire sont créés. Il n'y a pas de message d'erreur.
+
cd
+But de l'exercice : apprendre à se servir de .
et
+..
(«point» et «point point»). ..
désigne le
+répertoire père du répertoire courant, et .
désigne le répertoire
+courant. ..
sert beaucoup avec cd
, pour remonter
+d'un niveau dans une arborescence; .
est très utile avec des
+commandes comme mv
ou cp
, où il signifie en fait
+«ici».
+
+
+
+
+
+Vous vous trouvez dans votre répertoire personnel, dans ~
(tilde).
+
~/Rapport/docs/afaire/
+
++Taper +
+ ++cd Rapport/docs/afaire +
~/Rapport/docs/fait/
+
+
++cd ../fait +
~/Rapport/
+
++Taper +
++cd ../.. ++
+ou +
++cd ~/Rapport +
less
le contenu de ~/www/index.html
+
+
++Il faut taper +
+ ++less ~/www/index.html ++
+ou +
++less ../www/index.html ++
~/Rapport/docs/
+
+
++cd docs/ ++
~/Mail/
+
+
++Il y a un petit piège dans cette question. En effet, si vous tapez
++ls -l Mail/ ++ +
+vous allez obtenir le contenu du répertoire Mail/
, mais pas le
+statut du répertoire lui-même. Il faut donc utiliser l'option -d
+de ls
:
+
+bireme ~ $ ls -ld Mail
+drwx------ 2 toto litt98 512 Apr 2 19:02 /users/98/litt/toto/Mail/
+
+
+Taper cd
, sans arguments.
+
+Strictement rien ! Ça n'a aucune importance. +
+chaland ~ $script bla ble bli blo blu
+La commande script a 5 paramètre(s), que voici : bla ble bli blo blu
+
+drakkar ~ $ combien galion +Il y a 5 personne(s) loguées sur galion en ce moment. +drakkar ~ $ +
+indice toto tata titi toto tutu ++ +
+renvoie l'indice de toto dans la liste tata titi toto +tutu, c'est-à-dire 3.
+Dans ce fichier, vous avez : +45 mots contenant «r», «s» ou «t», et parmi eux, +12 contiennent deux de ces lettres au moins. +Il y a aussi 10 mots ne contenant aucune voyelle. ++
+On veut aussi que le résultat soit placé dans un fichier, et que le résultat +soit classé : toutes les lignes qui contiennent «air», puis toutes celles qui +contiennent «eau», etc.
+coupe fic 4 8 ++
+affichera les lignes 4 à 8 du fichier fic. Affichez des messages +en cas d'erreur (nombre de paramètres incorrect, fichier inexistant, etc). +
tar zcvf nouveaunom fichiersaregrouper+ + +
+Avant d'envoyer des fichiers tar, on utilise uuencode. +
+ ++Écrivez une commande tarmail qui prend deux arguments, une +adresse et un nom de répertoire, et qui envoie par mail le contenu de +l'arborescence du répertoire précédée d'un message expliquant comment la +récupérer.
+ + ++Note : pour récupérer un fichier uuencodé, on tape uudecode et +pour reconstruire l'arborescence, on utilise tar zxvf fichier. +
+find . -name \( '*~' -0 'core' \) -print ++ +
+Écrivez un script qui prend en argument un nom de répertoire et qui +détruit tous les fichiers :
+ +