Vous êtes sur la page 1sur 6

Université Mohammed Premier Année universitaire 2019-2020

Faculté des Sciences Filière SMI - Semestre : S3


Département d’Informatique Module : Système d’Exploitation I
Responsable : E.M. DAOUDI

Examen : Session Ordinaire


Le Vendredi 10 Janvier 2020
Durée 1h30
Exercice 1 : (5 pts)
1. On suppose que le répertoire courant est « /home/smi » et que « rep » est un sous répertoire
du répertoire « smi ». Donner les résultats des commandes suivantes :
% (cd rep; pwd)
% pwd
% a=5
% { v=10 ; echo "a = $a v = $v" ; cd ~/rep; pwd ; }
%pwd
2. Soit « fiche » un fichier du répertoire courant.
a. Donner les droits d’accès du fichier « fiche » après avoir exécuté la commande suivante :
% chmod 651 fiche
b. Donner les droits d’accès du fichier « fiche » après avoir exécuté la commande suivante :
% chmod u=rx,o=rx fiche
Exercice 2 : (7 pts)
1. Lister tous les noms des fichiers du répertoire courant dont le premier caractère est la lettre «
a » ou « A » et l’avant dernier caractère est la lettre « t ».
2. Soit «fiche » un fichier du répertoire courant :
a. Que fait la commande suivante :
% grep "a*" < fiche
b. Que fait la commande suivante :
% grep ".$" < fiche
c. Afficher toutes les lignes du fichier « fiche » qui commencent avec un chiffre.
d. Afficher toutes les lignes du fichier « fiche » qui se terminent avec un chiffre suivi de « * ».
e. Afficher toutes les lignes du fichier « fiche » dont le deuxième caractère est un chiffre ou
la lettre « m ».
Exercice 3 : (8 pts)
Soit «etudiant» un fichier du répertoire courant. Chaque ligne de ce fichier contient le nom, le
prénom et la filière d’un étudiant séparés par « ; ». Elle a la forme suivante : prénon;nom;filière
1. Ecrire une commande qui affiche le contenu du fichier « etudiant ».
2. Trier le fichier « etudiant » par ordre alphabétique des filières.
3. Trier le fichier « etudiant » par ordre alphabétique des prénoms.
4. L’objectif dans cette question est d’écrire un script shell qui affiche le contenu du fichier
« etudiant » ligne par ligne sans afficher le champ filière et en affichant, en plus, le numéro de
chaque ligne. L’affichage a la forme suivante : prénon;nom;numéro de la ligne
a. Ecrire un script shell sans utiliser la commande « read » pour parcourir les lignes du fichier.
b. Ecrire un script shell en utilisant la commande « read » pour parcourir les lignes du fichier.
5. L’objectif dans cette question est de construire, à partir du fichier « etudiant » les noms des
logins (« logname ») des utilisateurs et les sauvegarder dans un nouveau fichier nommé
« login ». Chaque nom de login a la forme suivante : « première lettre du prénom.nom ».
Exemple : le nom de login de l’étudiant « mostafa;daoudi;smi » est « m.daoudi ».
Université Mohammed Premier Année universitaire 2019-2020
Faculté des Sciences Filière SMI - Semestre : S3
Département d’Informatique Module : Système d’Exploitation I
Responsable : E.M. DAOUDI

Correction de l’examen de la Session Ordinaire


Le Vendredi 10 Janvier 2020

Exercice 1 : (5 pts)
1. On suppose que le répertoire courant est « /home/smi » et que « rep » est un sous répertoire
du répertoire « smi ». Donner les résultats des commandes suivantes :
% (cd rep; pwd)
% pwd
% a=5
% { v=10 ; echo "a = $a v = $v" ; cd ~/rep; pwd ; }
%pwd
2. Soit « fiche » un fichier du répertoire courant.
a. Donner les droits d’accès du fichier « fiche » après avoir exécuté la commande suivante :
% chmod 651 fiche
b. Donner les droits d’accès du fichier « fiche » après avoir exécuté la commande suivante :
% chmod u=rx,o=rx fiche

Réponses
1.
% (cd rep; pwd)
Affiche: /home/smi/rep
% pwd
Affiche: /home/smi
% a=5
% { v=10 ; echo "a = $a v = $v" ; cd ~/rep; pwd ; }
Affiche:
a=5 v=10
/home/smi/rep
%pwd
Affiche: /home/smi/rep

2.
2.a.
% chmod 651 fiche
Réponse: Le fichier « fiche » aura les droits suivants : rw- r-x --x
En effet : 6 = 110 correspond aux droit rw-
5 = 101 correspond aux droits r-x
1= 001 correspond aux droits --x
2.b.
% chmod u=rx,o=rx fiche
Réponse: le fichier « fiche » aura les droits suivant : r-x r-x r-x
Exercice 2 :
1. Lister tous les noms des fichiers dont le premier caractère est la lettre « a » ou « A » et l’avant
dernier caractère est la lettre « t ».
Réponse:
- En utilisant la commande « grep »
% ls | grep "^[aA].*t.$" ou % ls | grep "^[aA]" | grep "t.$"
- Sans utiliser la commande « grep »
% ls -d [aA]*t?

2. Soit «fiche » un fichier du répertoire courant :


a. Que fait la commande suivante :
% grep "a*" < fiche
Réponse: elle affiche toutes les lignes du fichier « fiche ».
En effet : elle affiche toutes les lignes du fichier « fiche » qui contiennent l’expression
"a*" c’est-à-dire toutes les lignes où le caractère « a » peut apparaître 0 (n’apparait pas)
ou plusieurs fois.

b. Que fait la commande suivante :


% grep ".$" < fiche
Réponse : elle affiche toutes les lignes du fichier « fiche » sauf les lignes vides.
En effet : elle affiche toutes lignes du fichier « fiche » qui se termine avec un caractère,
donc toutes les lignes non vides.

c. Afficher toutes les lignes du fichier « fiche » qui commencent avec un chiffre.
Réponse :
% grep "^[0-9]" < fiche
d. Afficher toutes les lignes qui se terminent avec un chiffre suivi de *
Réponse:
% grep "[0-9]\*$" < fiche
e. Afficher toutes les lignes dont le deuxième caractère est un chiffre ou la lettre « m ».
Réponse :
% grep "^.[0-9m]" < fiche

Exercice 3 : (8 pts)
Soit «etudiant» un fichier du répertoire courant. Chaque ligne de ce fichier contient le nom, le
prénom et la filière d’un étudiant séparés par « ; ». Elle a la forme suivante : prénon;nom;filière
1. Ecrire une commande qui affiche le contenu du fichier « etudiant ».
Réponse:
% cat etudiant
ou
% head -n +1 etudiant # afficher à partir de la première ligne du fichier « etudiant »

2. Trier le fichier « etudiant » par ordre alphabétique des filières.


Réponse : Les lignes du fichier « etudiant » sont organisées par champs où le séparateur de
champs est « ; ». Donc on effectue un trie par ordre alphabétique suivant le 3ème champ.
% sort -k3 -t" ;" < etudiant

3. Trier le fichier « etudiant » par ordre alphabétique des prénoms.


Réponse :
% sort etudiant
4. L’objectif dans cette question est d’écrire un script shell qui affiche le contenu du fichier
« etudiant » ligne par ligne sans afficher le champ filière et en affichant, en plus, le numéro de
chaque ligne. L’affichage a la forme suivante : prénon;nom;numéro de la ligne
a. Ecrire un script shell sans utiliser la commande « read » pour parcourir les lignes du fichier.
Réponses: Les données du fichier «etudiant» sont organisées en 3 champs séparées par « ; ».

Solution 1 :
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
let n=`wc -l < etudiant` # n désigne le nombre de lignes du fichier « etudiant »
while test $i -le $n ; do # tant que le numéro de la ligne courante est inférieur à n
# on extrait les champs 1 et 2 (prénom et nom) de la ligne courante, et on les
# sauvegarde dans la variable « ligne »
ligne=`tail -n +$i < etudiant | head -n 1 | cut -f1,2 -d";" `
echo "$ligne;$i" # afficher prénom;nom;i où i est le numéro de la ligne courante.
let i=$i+1
done

Solution 2 :.
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
# on extrait les champs 1 et 2 et on les sauvegarde dans la variable var
var=` cut -f1,2 -d";" etudiant ` # ou var=$(cut -f1,2 -d";" etudiant)
for v in $var ; do
echo "$v;$i" # afficher prénom;nom;i où i est le numéro de la ligne courante.
let i=$i+1
done

b. Ecrire un script shell en utilisant la commande « read » pour parcourir les lignes du fichier.
Réponse 1:
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
while read ligne ; do # on lit le fichier « etudiant » ligne par ligne
lg =`echo $ligne | cut -f1,2 -d";"` # on extrait le prénom et le nom (champs 1 et 2)
echo "$lg;$i" # afficher prénom;nom;i où i est le numéro de la ligne courante.
let i=$i+1
done < etudiant # la lecture ‘effectue à partir du fichier « etudiant »

Réponse 2 :
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
# on extrait le prénom et le nom (champs 1 et 2) du fichier « etudiant » puis on
# parcourt ces champs en utilisant les pipes avec la boucle « while ».

cut -f1,2 -d";" etudiant | while read ligne ; do


echo "$ligne;$i" # afficher prénom;nom;i où i est le numéro de la ligne courante.
let i=$i+1
done
Réponse 3 :
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
# on extrait le prénom et le nom (champs 1 et 2) du fichier « etudiant » puis on
# les sauvegarde dans le fichier « res » ensuite on parcourt le fichier « res ».

cut -f1,2 -d";" etudiant > res


while read ligne ; do
echo "$ligne;$i" # afficher prénom;nom;i où i est le numéro de la ligne courante.
let i=$i+1
done < res

5. L’objectif dans cette question est de construire, à partir du fichier « etudiant » les noms des
logins (« logname ») des utilisateurs et les sauvegarder dans un nouveau fichier nommé
« login ». Chaque nom de login a la forme suivante : « première lettre du prénom.nom ».
Exemple : le nom de login de l’étudiant « mostafa;daoudi;smi » est « m.daoudi ».

Réponses 1: on parcourt le fichier sans utiliser la commande « read »

1ère Solution :
#!/bin/bash
# si le fichier « login » existe on le supprime
if test -e login ; then
rm login
fi
let i=1
let n=`wc -l < etudiant` # n désigne le nombre de lignes du fichier « etudiant »
cut -c1 < etudiant > tmp # on sauvegarde les premières lettres des prénoms dans le
fichier « tmp »
cut -f2 -d";" < etudiant > log # on sauvegarde les noms dans le fichier « log »
while test $i -le $n ; do
c=`tail -n +$i < tmp | head -n 1` # on sauvegarde la première lettre de la ligne courante
# (ligne i) dans la variable c
lg=`tail -n +$i < log | head -n 1` # on sauvegarde le de la ligne courante (ligne i) dans la
# variable g
echo "$c.$lg" >> login # on forme le logname: c.lg
let i=$i+1
done

2ème Solution:
#!/bin/bash
# si le fichier « login » existe on le supprime
if test -e login ; then
rm login
fi
let i=1
let n=`wc -l < etudiant` # n désigne le nombre de lignes du fichier « etudiant »
cut -c1 < etudiant > tmp # on sauvegarde les premières lettres des prénoms dans le
# fichier « tmp »
cut -f2 -d";" < etudiant > log # on sauvegarde les noms dans le fichier « log »
past tmp log -d”.” > login

3ème Solution :
#!/bin/bash
if test -e compte ; then
rm login
fi
let n=`wc –l etudiant`
let i=1
while test $i –le $n ; do
# on récupère la première lettre du prénom de la ligne courante.
c=`tail -n +$i < etudiant | head -n 1 | cut -c1`
# on récupère le nom (le deuxième champs) de la ligne courante.
lg=`tail -n +$i < etudiant | head -n 1 | cut -f2 -d";"`
# on forme la ligne i du fichier « login ».
echo "$c.$lg" >> login
let i=$i+1 # on incrémente le numéro de la ligne
done

Réponse 2: on parcourt le fichier avec la commande « read »


#!/bin/bash
if test -e login ; then
rm login
fi
while read ligne ; do
c=`echo $ligne | cut -c1`
lg=`echo $ligne | cut -f2 -d";"`
echo "$c.$lg" >> login
done < fiche

Réponse 3: en utilisant la commande « past »


#!/bin/bash

cut -c1 etudiant > rep1


cut -f2 -d";" etudiant > rep2
past rep1 rep2 -d"." > login
rm rep1 rep2

Vous aimerez peut-être aussi