Exercice Unix - Caractères spéciaux - Expressions rationnelles - Processus - Commandes

1- Exercice Unix - Caractères spéciaux - Expressions rationnelles

Exercice 1 : caractères spéciaux

On trouve sous UNIX plusieurs caractères ayant une signification spéciale : la barre oblique / qui indique le cheminement entre les répertoires, les métacaractères vus au TP 1, le dollar indiquant le début d'une variable. On remarquera que l'espace est un caractère spécial, permettant de séparer les arguments de la ligne de commande. On trouve également le dièse, indiquant le début d'un commentaire, le point-virgule, permettant d'écrire plusieurs commandes sur la même ligne.

Si l'on souhaite redonner un sens normal à ces caractères, il est nécessaire de les protéger, pour empêcher qu'ils soient interprétés par le shell. Pour cela, soit on place l'argument entre guillemets ou apostrophes : '3*2' ou "3;2", soit on précède juste le caractère spécial d'un backslash \ : 3\*2, ou tata\ yoyo. A noter que le backslash est lui-même un caractère spécial, que l'on peut protéger.

  1. Créez un répertoire TP2 et allez-y.
  2. Affichez successivement en utilisant des guillemets avec la commande echo les mots suivants  :
    1. 3*2
    2. ||||
    3. \|/|\|/|\|/
    4. **??**
    5. prenom ; nom
  3. Recommencez en n'utilisant que le backslash.
  4. Créez dans le répertoire courant des fichiers portant les noms ci-dessus. Est-ce possible pour tous ?
  5. Effacez les fichiers ci-dessus.
  6. Trouvez au moins 3 caractères non cités qu'il est nécessaire de protéger.

Exercice 2 : Expressions rationnelles

Les expressions rationnelles sont utilisées par plusieurs commandes très utiles pour filtrer (reconnaître) des mots. Elles ressemblent aux expressions contenant des métacaractères du shell, mais n'ont pas la même syntaxe. Le point . permet de filtrer un seul caractère quelconque. Les crochets utilisent la même syntaxe que pour le shell et ont le même sens. L'étoile est un opérateur postfixe signifiant ``autant de fois que l'on veut l'expression que l'on trouve avant''. On ajoute également le chapeau ^ et le dollar qui permettent d'ancrer l'expression respectivement en début ou en fin de ligne. On peut rajouter des parenthèses précédées d'un backslash pour grouper les expressions.

Exemple : ^l*$ permet de reconnaître les lignes composées uniquement de l et les lignes vides. Si on veut supprimer les listes vides, il faut faire ^ll*$

L'expression ab\(ab\)* permet de trouver les lignes contenant une suite ababababababab.

Attention : pour ne pas que les caractères spéciaux soient interprétés par le shell, il est conseillé de toujours mettre les expressions rationnelles entre apostrophes.

  1. Quelle expression utiliser pour trouver une ligne contenant un groupe de a par multiple de trois. Pour trouver les nombres entiers.

La commande grep expr fich1 ... fichn permet d'afficher toutes les lignes des fichiers indiqués contenant l'expression expr. grep accepte les options -v permettant d'afficher les lignes ne comprenant pas le motif, -l qui affiche uniquement le nom des fichiers contenant le motif et -i qui ignore les différences entre majuscule et minuscule.

  1. Quels sont les fichiers dans /etc/ contenant le mot block.
  2. Quels sont les fichiers de /etc/ contenant le mot 127.0.0.1
  3. Quels sont les fichiers de /etc/ contenant des nombres de plus de trois chiffres.
  4. Affichez toutes les lignes des fichiers de /etc/ contenant un a, suivi d'un nombre quelconque de p, suivi d'un a.
  5. Quelle expression utiliser pour trouver des lignes vides ?

La deuxième commande qui nous intéresse qui permet de retrouver des fichiers est find rep -name 'nom' qui permet de retrouver tous les fichiers situés dans rep ou un sous-répertoire portant le nom nom. nom peut contenir des métacaractères identiques à ceux du shell (mais pas des expressions rationnelles...). Cependant, c'est à find d'interpréter les caractères et non au shell, donc il est nécessaire de placer nom entre apostrophe.

  1. Affichez tous les fichiers et sous-répertoires de votre répertoire principal.
  2. En utilisant l'option -type (cf. le manuel), n'affichez que les fichiers. Puis recommencez avec que les répertoires.
  3. En utilisant l'option -newer et la commande touch, affichez tous les fichiers de votre répertoire qui sont plus récent que le début du TP.
  4. Trouvez tous les fichiers datant de cette année dans /etc.

2- Exercices UNIX sur les commandes cut et past

Exercice 1

Afficher les trois informations suivantes (provenant de /etc/passwd) : nom de connexion de l'utilisateur, nom complet (champ libre) et shell attribué à l'utilisateur. Si /etc/passwd avait ce contenu :

root:Uhu)j9Pg[vz0J":0:0:Le manie tout:/:/bin/tcsh
daemon:*:1:1::/etc:
bin:*:2:2::/usr/bin:
sys:*:3:3::/usr/src:
adm:*:4:4: Administrateur du système:/usr/adm:/bin/sh
adam:QfTyu(lfmL$:100:100:Adam Poupon:/home/staff/adam:/bin/ksh
durand:gVFGjui01kj:102:100:Michel Durand:/home/staff/duarnd:/bin/ksh

Le résultat devrait être :

USER            WHO IS                          SHELL
root Le manie tout /bin/tcsh
daemon
bin BIN
sys SYS
adm Administrateur du système /bin/sh
adam Adam Poupon /bin/ksh
durand Michel Durand /bin/ksh

Exercice 2

Soit le fichier des comptes des clients. On suppose qu'il a la structure suivante : 5 chiffres pour le code banque, 5 chiffres pour le code guichet, 10 chiffres pour le numéro de compte, 1 lettre pour compléter le numéro de compte, 2 chiffres pour la clé RIB, 30 caractères pour la désignation du client. Produire en sortie les informations suivantes (séparées par la barre verticale) : Désignation du client, son numéro à 10 chiffres et la lettre complétant ce numéro. Soit le fichier des gestionnaires des comptes. Il se compose de lignes ayants les champs (séparés par la barre verticale) suivants : Désignation du gestionnaire, lettre du numéro de compte des clients dont il est responsable. Produire en sortie un listing avec les informations suivantes : Désignation du gestionnaire, le client dont il est responsable, le numéro de son compte.

resultats

 Nom             Résultats
 -------------------------
 Yann 104:33:48
 Tudor 8:19:0
 Patrick 15:98:48
 Carole 104:33:20
 Gérard 32:0:10
 René 5:13:10
 Lucienne 15:98:48

Utilisez la calculatrice en ligne (commande bc pour basic calculator) pour produire un fichier ayant le contenu de resultats plus une 3ème colonne qui est la somme des trois points de la colonne résultats.


Correction : Exercices UNIX sur les commandes cut et past

Exercice 1 :

echo 'USER WHOIS SHELL'; cut -d : -f 1,5,7 /etc/passwd | tr : '\t'


Exercice 2 :

cut -c 24- compte > /tmp/clients
cut -c 6-20 compte > /tmp/nums
cut -c 21 compte > /tmp/lettres

La première commande crée le fichier /tmp/clients qui contient les désignations des clients, la deuxième commande crée les numéros de comptes et la troisième crée un fichier de lettres de comptes.

paste -d "||" /tmp/clients /tmp/nums /tmp/lettres

Cette commande réalise la mise bout-à-bout des lignes des 3 fichiers en séparant les contenus par des barres verticales. Ce qui donne :
Désignation | Numéro de compte | Lettre

paste -d "||" /tmp/clients /tmp/nums /tmp/lettres | join -t '|' -1 2 -2 3 -o 1.1,2.1,2.2 gestion -

Le résultat du paste est 'join' sur le même champ avec le fichier gestion. On ne fourni que les champs nécessaires (le premier champ du fichier gestion et les 2 premiers du résultat du pipe).

Exercice 3 :

Si on considère que fichier est le fichier résultat sans les lignes de tête :

cat fichier | tr -s '\t' | cut -f 2 | tr : + | bc | paste -d '\t' fichier -

tr -s '\ t' : remplace les tabulations succéssives par une seule (pour avoir la liste des nombres en 2 ème champ; sinon nous aurons une chaîne vide en deuxième champ s'il y avait plusieurs tabulations après le nom cut -f 2 : prend le second champ (Nbr1:Nbr2:Nbr3) tr : + : transforme Nbr1:Nbr2:Nbr3 en Nbr1+Nbr2+Nbr3 bc : évalue l'expression Nbr1+Nbr2+Nbr3 paste -d '\ t' fichier - : rajoute à fichier, en troisième colonne, le résultat de bc

3- Exercice script unix shell - processus -


L'objectif de cet exercice est de créer une commande ikill ne prenant pas d'argument mais demandant un nom de programme à l'utilisateur et tuant ce programme. On utilisera les commandes tr -s ' ', cut, kill, read, ps -fA, grep, grep -v et echo.

La commande affichera :

Quel processus voulez-vous supprimer ?

Vous rentrerez un nom de processus, par exemple emacs et tous les processus emacs seront supprimés.

  1. Lire les pages de man des commandes utilisées.
  2. Quels sont les greps qu'il faut effectuer sur la sortie de ps -fA pour ne conserver que le processus que l'on souhaite tuer (essayer avec ps -fA | grep bash). Utilisez la variable $USER.
  3. Stockez la liste de PID des processus à supprimer dans la variable $PID et affichez la.
  4. Écrire la commande. N'oubliez pas de vérifier que la variable $PID n'est pas vide avant d'effectuer le kill.

Correction :

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
echo -n "Quel processus voulez-vous supprimer ? "
read NAME
PID=`ps -Af | grep "$USER" | grep "$NAME" | grep -v grep | tr -s ' ' | cut -f 3 -d ' '`
if [ -z $PID ]
then
echo Pas de processus $NAME...
exit -1
fi
kill $PID

4- Exercice sur la commande mkdir et rmdir

1 - Créez trois répertoires en une seule ligne de commande.
2 - Effacez ces trois répertoires en une seule ligne de commande.
3 - Que se passe-t-il si vous tapez
             mkdir mkdir
4 - Vous voulez détruire un répertoire bla/, dont ls vous dit qu'il est vide. Cependant, quand vous tapez
             rmdir bla
     la machine vous répond :
             rmdir: bla: Directory not empty
     Que faut-il faire ?
5 - Est-ce que mkdir peut prendre des options ?
6 - A quelle condition est-ce que la ligne de commande
             mkdir Rapport/annexes
     peut fonctionner et créer effectivement ce sous-répertoire ?
7 - Y a-t-il une option de mkdir qui permette de créer à la fois un répertoire et un sous-répertoire de ce répertoire ?
8 - Comment créer un répertoire en spécifiant des droits ?
9 - Quel est l'effet de la commande suivante :
             rmdir -p toto/tata/tutu/
10 - Vous voulez créer à la fois un répertoire toto/ et un sous répertoire tutu/ dans toto/. Quelle option faut-il utiliser pour que :
     - Si toto/ n'existe pas, le répertoire et son sous-répertoire soient créés;
     - Si toto/ existe déjà, le sous-répertoire tutu/ soit créé, sans message d'erreur.

Correction : Exercice sur la commande mkdir et rmdir

  1. .

    Si vous voulez créer trois répertoires bla, ble et bli, tapez

    mkdir bla ble bli
    
  2. .

    Il faut taper

    rmdir bla ble bli
    
  3. Vous créez chez vous un répertoire appelé mkdir.

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

  5. Oui, une : l'option -p, dont on va parler tout de suite.

  6. Il faut que le répertoire Rapport existe, pour que l'on puisse y créer un sous-répertoire.

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

  8. 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/
    
  9.  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.

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