Parties
- Table des matières
- revision des commandes
- telecharger fichiers
- révision tubes
- commandes affichant sur la sortie standard
- principe de l'entrée d'une commande
- données de "grep root /etc/passwd"
- entrée de "grep root"
- données de "cd public_html"
- deux modes de fonctionement: tail
- deux modes de fonctionement: grep
- deux modes de fonctionement: sed
- commandes lisant sur l'entrée standard
- possibilités de tube
- tubes: ls -l | head
- tubes: grep | wc
- tubes: ps | grep
- tubes: head | tail
- questions diverses
- commande "df"
- commande "df": taille
- commande "top"
- commande "sort"
- sort numerique
- sort inversé
- evaluation numerique
- méta-caractères
- Méta-caractère "*": répertoires: présentation
- Méta-caractère "*": "*.txt"
- Méta-caractère "*": "*robot*"
- Méta-caractère "*": "*/README.html"
- Méta-caractère "*": "*/*"
- Méta-caractère "*": "/etc/*/*.txt"
- Méta-caractère "*": "*/important*/*"
- substitution de commandes
- substitution de commande: présentation
- substitution de commande: rm
- substitution de commande: rm `find`
- substitution de commande: var=`echo | sed`
- substitution de commande: var=`echo | sed` (2)
- substitution de commande: var=`echo | sed` (3)
- "cut" et 'passwd'
- decouverte du fichier passwd
- cut autre champ
- redirection
- champs nom et prenom
- cut | cut
- revision grep
- boucles for et liste de valeurs
- création de répertoires utilisateurs
- modification des pages utilisateurs
1. Table des matières
1.1 Table des matières
Bienvenue au TP 5.
Avez vous bien fait et fini le TP précèdent?
C'est important d'avoir bien compris les notions du TP précèdent avant de faire ce TP.
Si ce n'est pas fait, finissez d'abord le TP précèdent.
Cliquez sur "début du TP" pour commencer.
Normalement vous n'aurez pas besoin d'utiliser les autres boutons.
Si jamais vous quittez le TP et que vous ne voulez pas tout recommencer, utilisez les autres boutons.
1.2 revision des commandes
Faites les liens:
- oui, très bien.
- non, c'est pas tout à fait ca
- rechercher un mot dans un fichier : grep
- copier un fichier : cp
- renommer un fichier : mv
- trouver un fichier dans un répertoire et ses sous-répertoires, récursivement : find
- remplacer un mot par un autre dans un fichier : sed
- afficher des lignes au début d\'un fichier : head
- afficher des lignes à la fin d\'un fichier : tail
- regarder (lire) le contenu d\'un fichier : less
- supprimer un répertoire et tout ce qu\'il contient : rm -r
- supprimer un fichier : rm
1.3 telecharger fichiers
créez et rentrez dans le répertoire "~/systeme/tp5"
téléchargez le fichier "fichiers-tp5.tar.gz"
désarchivez-le avec: "tar xzvf ~/Desktop/fichiers-tp5.tar.gz"
2. révision tubes
2.2 commandes affichant sur la sortie standard
Sortie d'une commande
Pour que ça ait un sens d'enchaîner deux commandes avec un tube, il faut que la première commande écrive des données sur sa sortie.
La sortie est, normalement (sauf tube ou redirection), affichée à l'écran.
Exercice
Parmi les commandes suivantes, lesquelles peuvent (en général) écrire des données sur leur sortie ?
En d'autre termes, quelles sont les commandes qui sont susceptibles d'afficher quelque-chose?
- ls
- rm -f README.html
- cd public_html
- mv page.html /tmp
- find . -name "*.png"
- sed -i 's/png/gif/g' essai.html
- head README.html
- grep dupond /etc/passwd
2.3 principe de l'entrée d'une commande
Entrée d'une commande
Pour que ça ait un sens d'enchaîner deux commandes avec un tube, il faut que la deuxième commande lise des données sur son entrée.
De nombreuses commandes UNIX ont été prévues pour lire des données, soit dans un fichier, soit dans leur entrée.
Par exemple:
"grep dumoulin /etc/passwd" lit dans le fichier "/etc/passwd"
"grep dumoulin" lit dans dans son entrée. Vous remarquerez que dans ce cas, on ne donne pas de nom de fichier... puisqu'on n'en utilise pas!
Quelles commandes utilisent leur entrée?
Pour savoir si une commande lit dans son entrée il faudrait regarder sa documentation.
(cherchez "standard input" ou "entrée standard")
En général, vous pouvez aussi le deviner, en essayant de comprendre ce que fait la commande.
Vous pouvez aussi vérifier en essayant la commande. Si celle-ci ne vous rend pas la main (elle bloque), il y a de grandes chances qu'elle soit en train de lire dans son entrée (le clavier).
Exercice
Tapez la commande "grep root /etc/passwd"
Est-ce que l'invite de commandes s'affiche après?
(Est-ce que vous pouvez à nouveau taper une commande?)
2.4 données de "grep root /etc/passwd"
La commande "grep" permet de rechercher un mot quelquepart
Où est-ce que la commande suivante recherche le mot "root" ?
"grep root /etc/passwd"
- dans le fichier /etc/passwd
- dans l'entrée de la commande grep, qui correspond, ici, à ce qui est saisi au clavier
- sur la sortie standard de grep
- toute l'information nécessaire au fonctionnement de cette commande est fournie directement par les noms de ses arguments
2.5 entrée de "grep root"
La commande "grep" permet de rechercher un mot quelquepart
Où est-ce que la commande suivante recherche le mot "root" ?
"grep root"
- dans l'entrée de la commande grep, qui correspond, ici, à ce qui est saisi au clavier
- dans le fichier /etc/passwd
- toute l'information nécessaire au fonctionnement de cette commande est fournie directement par les noms de ses arguments
- sur la sortie standard de grep
2.6 données de "cd public_html"
La commande "cd public_html" permet de changer de répertoire courant.
Où est-ce que la commande trouve ses données ?
- toute l'information nécessaire au fonctionnement de cette commande est fournie directement par les noms de ses arguments
- dans l'entrée de la commande cd, qui correspond, ici, à ce qui est saisi au clavier
- sur la sortie standard de "cd"
2.7 deux modes de fonctionement: tail
De nombreuses commandes ont deux modes de fonctionnement:
l'une travaille sur un (ou plusieurs) fichiers, l'autre utilise l'entrée de la commande.
déterminez le type des commandes:
- oui
- non
- tail -n 3 toto : travaille sur un fichier
- tail -n 3 : travaille sur l'entrée de la commande
2.8 deux modes de fonctionement: grep
déterminez le type des commandes:
- oui
- non
- grep toto titi : travaille sur un fichier
- grep toto : travaille sur lentrée de la commande
2.9 deux modes de fonctionement: sed
déterminez le type des commandes:
- oui
- non
- sed -i 's/mot/autre/g' toto : travaille sur un fichier
- sed 's/mot/autre/g' : travaille sur lentrée de la commande
2.10 commandes lisant sur l'entrée standard
Parmi les suivantes, quelles commandes lisent sur leur entrée?
Indications:
- prenez votre temps. c'est une question longue
- essayez de bien comprendre, dans le détail, ce que fait chaque commande
- regardez la documentation de la commande (cherchez "entrée standard" ou "standard input")
- wc -l passwd
- wc -l
- sed -i 's/png/gif/g' essai.html
- sed 's/png/gif/g'
- ls -l
- head
- head README.html
- find . -name "*.png"
- grep png
- tail -n 1
- cd /tmp
2.11 possibilités de tube
Comme on l'a vu précédemment, pour que ça ait un sens d'enchaîner deux commandes avec un tube, il faut que la première commande écrive des données sur sa sortie et que la deuxième lise des données sur son entrée.
Avec ces critères, quelles commandes, parmi les suivantes, ont un sens?
- find . -name "*.png" | grep durand
- ls | find . -name "*.png"
- grep dupond /etc/passwd | cd
- head README.html | tail -n 1
- cd /tmp | grep png
- grep png README.html | wc
- grep bash /etc/passwd | grep dupond
- ls -l | wc
- grep dupond /etc/passwd | ls -l
- ls -l | echo bonjour
- rm page.html | cd public_html
2.12 tubes: ls -l | head
Quelle commande faut-il taper pour afficher les 3 premières lignes de la sortie de la commande "ls -l" ?
(on utilisera des espaces avant et après le "|" )
- ls -l | head -n 3
- ls -l | head -3
2.13 tubes: grep | wc
Quelle commande faut-il taper pour compter le nombre de lignes contenant le mot "bash" dans le fichier "/etc/passwd" ?
- grep bash /etc/passwd | wc -l
- grep bash /etc/passwd | wc
2.14 tubes: ps | grep
Quelle commande faut-il taper pour afficher les processus contenant le terme "mozilla" ?
(options "-ef" pour "ps")
2.15 tubes: head | tail
En utilisant les commandes "head" puis "tail" (avec un tube),
quelle commande faut-il taper pour afficher uniquement la 6eme ligne du fichier "/etc/passwd" ?
(on utilisera les options "-n" : par exemple "head -n 3", avec un espace)
- head -n 6 /etc/passwd | tail -n 1
3. questions diverses
3.2 commande "df"
Tapez la commande "df -h"
Les points de montage sont affichés sur la colonne de droite.
Les périphériques ou systèmes de fichiers sont affichés sur la colonne de gauche.
Sur quel périphérique ou système de fichier sont physiquement situés vos fichiers (votre répertoire personnel) ?
3.3 commande "df": taille
Essayez de comprendre les nombres affichés sur les différentes colonnes.
Quelles est la taille totale du périphérique ou se trouvent vos fichiers?
- autour de 100 Mega octets
- autour de 1 Giga octets
- autour de 20 Giga octets
- autour de 50 Giga octets
- autour de 150 Giga octets
- autour de 600 Giga octets
3.4 commande "top"
Dans une fenêtre terminal, tapez la commande "top"
"top" permet, entre-autres, d'afficher les processus qui consomme le plus de ressources cpu (processeur).
Ouvrez une nouvelle fenêtre de votre navigateur web, puis redimensionnez-là, de manière à pouvoir voir l'affichage de "top".
Pendant une dizaine de secondes redimensionnez la fenêtre navigateur, tout en observant l'affichage de "top".
Vous devriez voir plusieurs processus monter vers le haut:
- le serveur X (Xorg ou XFree86), qui s'occupe de l'affichage
- le navigateur (mozilla firefox)
- le gestionnaire de fenêtre (metacity ou Kwin) qui gère le redimensionnement
3.5 commande "sort"
Regardez votre cours à propos de la commande "sort".
Regardez le contenu du fichier "mots.txt"
S'il était trié dans l'ordre alphabétique, quel serait le dernier mot du fichier mots.txt ?
3.6 sort numerique
Quel est le plus grand numero contenu dans le fichier "numeros.txt" ?
- 32740
- 9995 : Non! Vous avez trié le fichier par ordre alphabetique, alors qu'il s'agit de numéros...
3.7 sort inversé
En regardant la page "man" de sort...
Quelle commande faut-il taper, pour afficher le contenu du fichier "mots.txt" trié en ordre alphabétique inversé ?
("inversé" = "reverse" en anglais)
3.8 evaluation numerique
On suppose qu'on a deux variables "a" et "b" contenant des numéros.
Qu'est-ce qu'il faut taper pour affecter dans une variable "c" la somme de ces deux variables.
(pas d'espaces)
Indications:
Essayez! Décomposez en trois étapes:
- affectez des valeurs aux variables a et b
- trouvez la bonne expression en affichant le résultat avec "echo ...."
- ensuite affectez l'expression à la variable "c"
- c=$(($a+$b))
- c=$((a+b)) : c est correct, mais on prefere en general bien indiquer que a et b son des variables: c=$(($a+$b))
4. méta-caractères
4.2 Méta-caractère "*": répertoires: présentation
Méta-caractère "*" et répertoires
Le méta-caractère "*" peut-être utilisé pour designer des chemins en dehors du répertoire courant.
Le méta-caractère "*" ne traverse pas de répertoires:
par exemple: "systeme/essai.txt" ne peut pas correspondre à l'expression "*.txt"
Pour spécifier des répertoires dans une expression, il faut explicitement les indiquer avec des "/"
par exemple: "systeme/essai.txt" correspond bien aux expressions "systeme/*.txt" et "*/*.txt"
4.3 Méta-caractère "*": "*.txt"
Parmi les chemins suivants, lesquels peuvent être sélectionnés par l'expression:
"*.txt"
- README.txt
- robots.txt
- /tmp/robots.txt
- tp2/documentation.txt
- /documentation.txt
4.4 Méta-caractère "*": "*robot*"
Parmi les chemins suivants, lesquels peuvent être sélectionnés par l'expression:
"*robot*"
- info-robots.txt
- petit-robot
- robot-cup
- robots/page.html
- tp3/robot.txt
- /liste-robots.html
- programme.robot
4.5 Méta-caractère "*": "*/README.html"
Parmi les chemins suivants, lesquels peuvent être sélectionnés par l'expression:
"*/README.html"
- tp1/README.html
- README.html
- /tmp/README.html
- tp1/exo/README.html
- documentation/README.html
4.6 Méta-caractère "*": "*/*"
Parmi les chemins suivants, lesquels peuvent être sélectionnés par l'expression:
"*/*"
- tp2/exo
- tp2/README.html
- tp2/exo/doc.txt
- /tmp/README.html
- exo/passwd
4.7 Méta-caractère "*": "/etc/*/*.txt"
Parmi les chemins suivants, lesquels peuvent être sélectionnés par l'expression:
"/etc/*/*.txt"
- /etc/X11/rgb.txt
- /etc/icu/convrtrs.txt
- etc/doc/BU.txt
- /etc/X11/backup/rgb.txt
- /etc/doc.txt
4.8 Méta-caractère "*": "*/important*/*"
Parmi les chemins suivants, lesquels peuvent être sélectionnés par l'expression:
"*/important*/*"
- tp1/important-controle/doc.txt
- tp2/important/README.txt
- important/README.txt
- tp1/exo-important-2/sujet
- sources/tres-important/README.txt
- doc.txt
- essai/important/repertoire
5. substitution de commandes
5.1 substitution de commandes
5.2 substitution de commande: présentation
Substitution de commande: exemples
Tapez la commande:
cat liste.txt
Vous devriez voir une liste de noms s'afficher.
Maintenant tapez:
echo resultat: `cat liste.txt` :fin resultat
Regardez bien le résultat et essayez de comprendre.
Tapez la commande:
grep du liste.txt
Maintenant tapez:
echo resultat: `grep du liste.txt` :fin resultat
Analysez bien le résultat et essayez de comprendre.
..sinon vous n'arriverez pas à faire les exercices suivants!
Substitution de commande: explication
La substitution de commande agit comme si on faisait un copier-coller de l'affichage de la commande2 à la place de tout ce qui est dans les guillemets inversés.
commande1 bla bla `commande2` bla bla
5.3 substitution de commande: rm
Rappel: comment fait-on pour afficher toutes les lignes contennant les lettres "du" du fichier "liste.txt" ?
Exercice
Maintenant, on veut supprimer tous les fichiers (listés dans "liste.txt") dont les noms contiennent les lettres "du".
En utilisant la commande "rm" et en vous inspirant de l'exemple précèdent, quelle commande faudrait-il taper?
- rm `grep du liste.txt`
- rm `grep du liste.txt `
5.4 substitution de commande: rm `find`
Rappel: comment fait-on pour afficher tous les noms des fichiers ".txt" contenus dans le répertoire courant et ses sous-répertoires...?
Exercice
En utilisant la commande "rm" et en utilisant la substitution de commandes sur la commande "find", quelle commande faut-il taper pour supprimer tous les fichier ".txt" contenus dans le répertoire courant et ses sous-répertoires...?
(on utilisera l'option "-iname" de find)
(on n'utilisera PAS l'option -exec de find)
- rm `find -iname "*.txt"`
- rm `find -iname "*.txt" `
- rm `find -iname "*txt" `
- rm `find -iname "*txt"`
5.5 substitution de commande: var=`echo | sed`
La variable "fichier" contient un nom de fichier.
Par exemple "fichier=home.png".
En utilisant "echo", quelle commande faut-il taper pour afficher la valeur contenue dans la variable "fichier"?
5.6 substitution de commande: var=`echo | sed` (2)
Rappel
Il y a deux modes de fonctionnement pour la commande sed:
Remplacer "mot1" par "mot2" dans un fichier:
sed -i 's/mot1/mot2/g' nomfichier
remplacer "mot1" par "mot2" à partir de l'entrée et afficher le résultat:
sed 's/mot1/mot2/g'
Exercice
On veut transformer la valeur affichée par la commande précédente en remplaçant les lettres "png" par "jpg"
Pour cela on ajoute un tube à la commande précédente (echo $fichier) et on utilise la commande "sed".
Quelle est la commande à taper?
(on écrira toute la ligne: les deux commandes, echo et sed avec le tube)
- echo $fichier | sed 's/png/jpg/g'
5.7 substitution de commande: var=`echo | sed` (3)
On veut affecter le résultat de la commande précédente à une variable appelé "fichier_jpg"
En reprenant la commande précédente et en utilisant la substitution de commande, que faut-il écrire?
(Indice: ça commence par "fichier_jpg=" )
(essayez avant de répondre)
- fichier_jpg=`echo $fichier | sed 's/png/jpg/g'`
- fichier_jpg=`echo $fichier | sed 's/png/jpg/g' `
6. "cut" et 'passwd'
6.2 decouverte du fichier passwd
Le fichier "passwd"
Regardez de près le contenu du fichier "passwd".
Vous verrez que chaque ligne est composée de champs séparés par des ":"
Essayez de comprendre le contenu de chaque champ.
- Nom de connexion de l'utilisateur (« login »)
- un mot de passe chiffré optionnel
- l'identifiant numérique de l'utilisateur
- l'identifiant numérique du groupe de l'utilisateur
- le nom complet de l'utilisateur ou un champ de commentaires
- le répertoire personnel de l'utilisateur
- l'interpréteur de commandes de l'utilisateur
La commande "cut"
La commande "cut" permet de sélectionner des champs dans un fichier.
Il faut lui dire quel est le séparateur entre les champs, et quels champs afficher.
Exemples de séparateurs:
Dans "toto,titi,bonjour,argh" le séparateur est ","
Dans "toto titi bonjour argh" le séparateur est l'espace
Dans "toto:titi:bonjour:argh" le séparateur est ":"
Exemples de champ:
En utilisant le séparateur ",":
Dans "toto,titi,bonjour,argh" le champ 1 est "toto"
Dans "toto,titi,bonjour,argh" le champ 2 est "titi"
Dans "toto,titi,bonjour,argh" les champs 1,4 donnent "toto,argh"
Syntaxe de la commande:
en utilisant le séparateur "," afficher le 2ème champ de toutes les lignes du fichier "essai.txt"
cut -d ',' -f 2 essai.txt
Si on ne lui donne pas de nom de fichier, la commande "cut" peut aussi lire sur son entrée:
echo "a:b:c:d" | cut -d ':' -f 3
cette commande affiche: "c"
Exercice
Quelle commande faut-il taper pour afficher pour afficher tous les login des utilisateurs définis dans le fichier "passwd"?
(utilisez le même nombre d'espaces que dans les exemples ci-dessus)
6.3 cut autre champ
Quelle commande faut-il taper pour afficher tous les identifiants numériques des utilisateurs définis dans le fichier "passwd"?
6.4 redirection
Affichez le 5ème champ de tous les utilisateurs définis dans le fichier "passwd".
On veut conserver ce résultat dans un fichier appelé "noms.txt".
Pour cela on peut utiliser la redirection de la sortie de la commande précédente.
Quelle commande faut-il taper?
- cut -d ':' -f 5 passwd > noms.txt
6.5 champs nom et prenom
Quelle commande faut-il taper pour afficher les prénoms de tous les utilisateurs, en utilisant le fichier "noms.txt" ?
6.6 cut | cut
Dans les questions précédentes on a affiché les prénoms en deux étapes:
1. une commande cut redirigée dans un fichier
2. une deuxième commande cut sur le contenu de ce fichier
On veut faire la même chose en une seule étape, sans passer par un fichier et en utilisant un tube.
Quelle commande faut-il taper?
(on utilisera des espaces avant et après le "|" )
- cut -d ':' -f 5 passwd | cut -d ',' -f 2
6.7 revision grep
Quelle commande faut-il taper pour afficher les lignes contenant le mot "Jean" dans le fichier passwd?
6.8 boucles for et liste de valeurs
Boucles "for": liste de valeurs
Parfois il est plus lisible d'utiliser une variable pour contenir la liste de valeurs utilisée par une boulce for:
Au lieu d'ecrire:
for valeur in toto titi zozo; do
echo la valeur est: $valeur
done
on peut ecrire:
liste_valeurs="toto titi zozo"
for valeur in $liste_valeurs; do
echo la valeur est: $valeur
done
copiez cet exemple dans un fichier "creation-repertoires.sh" et executez le pour vérifier son fonctionement.
Substitution de commande
En utilisant la commande vue au début de cette partie ainsi que la substitution de commande :
Quelle ligne faut-il taper pour attribuer la liste de tous les logins contenus dans "passwd" à la variable "liste_valeurs" ?
Indication: ce sera quelquechose du type:
liste_valeurs=`COMMANDE`
n'ajoutez pas de guillemets doubles!
- liste_valeurs=`cut -d ':' -f 1 passwd`
- liste_valeurs=`cut -d ':' -f 1 passwd `
6.9 création de répertoires utilisateurs
En vous inspirant de la question précédente, modifiez le script "creation-repertoires.sh" pour qu'il crée l'arborescence suivante:
Le fichier "page.html" sera une copie du fichier fourni.
Pour vérifier votre travail, executez le fichier verif-tp5-manip.sh à partir du répertoire utilisateurs.
- e1a5f886dc0ed4e9b0501f4dfb50d3c9
6.10 modification des pages utilisateurs
Rappel
Il y a deux modes de fonctionnement pour la commande sed:
Remplacer "mot1" par "mot2" dans un fichier:
sed -i 's/mot1/mot2/g' nomfichier
remplacer "mot1" par "mot2" à partir de l'entrée et afficher le résultat:
sed 's/mot1/mot2/g'
Exercice
En vous inspirant de l'exercice précèdent (avec la boucle), remplacez le mot "UTILISATEUR" par le login correspondant dans tous les fichiers "page.html".
Attention, si vous voulez utiliser une variable dans l'expression de sed, vous devez employer de guillemets doubles " au lieu de guillemets simples! (échappement partiel...)
Pour vérifier votre travail, comme précédemment, exécutez le script
verif-tp5-manip2.sh
- 5bfab6d8b2113a434ea0ecbf9d49fbe9