Académique Documents
Professionnel Documents
Culture Documents
TRAVAUX PRATIQUES
Questions
1. Créer un script shell nommé "change" qui affichera la date de dernière modification d'un fichier
puis la modifiera avec l'heure actuelle et enfin réaffichera la date de dernière modification du
fichier.
Cette procédure acceptera 1 paramètre qui sera le nom du fichier.
Lorsque vous exécuterez "change mon_fic", le 12 février à 18 heures 12 vous obtiendrez le
résultat:
avant : -r--r--r-- 1 user group 40 Jan 8 2012 mon_fic
après : -r--r--r-- 1 user group 40 Fev 12 18:12 mon_fic
2. Créer un script shell nommé ‘’nombreJours’’ qui affichera le nombre de jours du mois courant.
‘’nombreJours’’ affichera pour février 2013 le message ‘’28 jours en février 2013’’.
3. Créer un script shell réalisant la création d’un répertoire ‘’Exercice25’’ contenant 15 fichiers
nommés ‘’Un’’ à ‘’Quinze’’. Chaque fichier contient une seule ligne :
i) ‘’Un’’ contient ‘’Première ligne’’
ii) ‘’Deux’’ contient ‘’Deuxième ligne’’
iii) …
iv) ‘’Quinze’’ contient ‘’Quinzième ligne’’
N.B : Vérifier que le répertoire à créer n’existe pas déjà sinon il ne sera pas recréé mais
les fichiers oui.
4. Créer un script shell qui réalise les opérations suivantes :
- Création sous votre répertoire ‘’TP2’’ d’un sous répertoire nommé ‘anneemoisjour’’ (Ex :
20160912 pour le 12 février 2013).
- Copie des fichiers de Exercice26 sous ce répertoire puis effacement de ces mêmes fichiers de
‘’Exercice26’’.
- Création de deux fichiers sous le répertoire d’accueil (Home) de la personne qui a lancé le
shell :
Un fichier nommé ‘’Gros_fichier.numero_du_shell’’ dans lequel se trouvera le
contenu concaténé des fichiers traités
Un fichier nommé ‘’Nom_du_script.numero_du_shell’’ dans lequel se trouvera le
nom des fichiers traités.
7. Créer un script nommé "table" permettant d'afficher des tables de multiplication. Ex.
"table 5 10" aura pour résultat l'affichage:
0x5=0
1x5=5
2 x 5 = 10
3 x 5 = 15
4 x 5 = 20
5 x 5 = 25
6 x 5 = 30
7 x 5 = 35
8 x 5 = 40
9 x 5 = 45
10 x 5 = 50
8. Utilitaire AWK
Les exercices portent sur le fichier mesure suivant:
nom de la lieu de la
date de la valeur correction correction correction valeur
| | | | | | | |
mesure mesure mesure brute 1 2 3 corrigée
18/12/199
marcel | brest | | 12.5 | 1.34 | 1.23 | -1.5 | 13.47 |
8
21/05/199
polo | loctudy | | 11.5 | 1.24 | 1.12 | -1.2 | 12.66 |
7
04/09/199
otto | camaret | | 9.3 | 0.98 | 1.17 | -1.12 | 10.33 |
5
Le champ valeur corrigée est la somme algébrique de la valeur brute et des 3 corrections.
8.1 Vous vous êtes bourrés sur le signe de la correction 1, de même dans la correction 2, vous avez
découvert que vous avez commis une petite erreur et qu'il fallait lui ajouter 0.1. Modifier le
fichier en prenant en compte ces corrections, faites en sorte que la valeur corrigée soit
modifiée en conséquence.
Dans le même exercice vous afficherez la somme totale des valeurs corrigées et la valeur corrigée
moyenne. Ces valeurs doivent être sauvegardées dans un fichier résultat.
8.2 Afficher les mesures ayant une année paire. Redirigez le résultat de la recherche vers un fichier
paire.
8.3 Vérifiez que le format de la date jj/mm/aaaa est correct ainsi que le format du lieu (formé que de
lettres de l'alphabet en minuscules ou majuscules).
8.4 Afficher les noms de mesure et leur valeur corrigée associée en vous servant d'un tableau
associatif.
2
@2016 Travaux pratiques – Programmation système en Shell
9. Cherchez dans toute l'arborescence les fichiers dont le nom se termine par .c, redirigez les erreurs
vers le fichier poubelle /dev/null
Commençant par X ou x.
Dont les noms ne contiennent pas de chiffre.
10. Chercher dans /usr les fichiers dont la taille dépasse 1Mo (2000 blocs de 500Ko) et dont les droits
sont fixés à 755 (-rwxr-xr-x).
11. Combien il y a de fichiers dans toute l'arborescence vous appartenant et ayant les droits fixés à
666 (-rw-rw-rw-).
12. Trouver tous les fichiers core dans l'arborescence et supprimez-les après confirmation.
13. Copiez le fichier /etc/passwd dans votre home directory. Editez uniquement les champs
contenant le login et la home directory.
14. Triez passwd sur le nom
15. Extraire les noms de login et UID puis triez suivant les UID, le tout en une seule commande, vous
redirigerez le tout vers un fichier.
16. Dans le fichier de résultat précédent remplacer les ":" par des " " (espace).
17. Editez les cinq dernières lignes du fichier.
18. Editez les cinq premiers caractères du fichier.
19. Créer un répertoire essai-grep dans votre home directory. Dans ce répertoire créer les fichiers
suivants:
tomate poire pomme cerise Fraise fraise courgette POMME3 afraise
Editez les fichiers (sortie de la commande ls redirigée vers grep) avec les critères sur leur nom
suivant:
Critère 1 Le nom doit être Fraise ou fraise
Critère 2 se est en fin de nom
Critère 3 ai est présent dans le nom
Critère 4 Nom contenant un chiffre numérique
Critère 5 Nom contenant la chaîne mm ou MM
20. Copiez le fichier /etc/passwd dans votre home directory. Editez la ligne commençant par votre
nom de login.
21. Dans le fichier passwd qui est dans votre home directory, éditez les lignes commençant par des
noms de login ne contenant pas de chiffre.
22. Editez les lignes du fichier passwd commençant par des noms de login de 3 ou 4 caractères.
3
@2016 Travaux pratiques – Programmation système en Shell
23. Dans votre répertoire courant, créez un répertoire courant essai_droit, par défaut ce répertoire
est à 755 (rwxr-xr-x), quelles sont les commandes (en notation symbolique et en base 8) pour lui
donner les droits suivant (on suppose qu'après chaque commande on remet le répertoire à 755:
propriétaire groupe les autres
droit en droit en droit droit en droit en droit droit en droit en droit
lecture écriture d'accès lecture écriture d'accès lecture écriture d'accès
commande
oui oui oui oui non oui non non oui
1
commande
oui non oui non oui non non non oui
2
commande
non oui non non non oui oui non non
3
commande
non non oui oui non oui non non non
4
24. Créez un fichier droit dans le répertoire essai_droit, par défaut ce fichier est à 644 (rw-r--r--).En
partant du répertoire courant, pour chaque commande de l'exercice précédent, essayez
d'accèder au répertoire essai_droit (commande cd), de faire un ls dans essai_droit et de modifier
le fichier avec un éditeur quelconque (vi par exemple).
25. Tapez la commande umask, de manière à ce que les fichiers lors de leur création aient par défaut
les droits 640 (rw-r-----), et les répertoires 750 (rwxr-x---).
26. Dans votre répertoire courant, créez en une commande les fichiers suivants:
annee1 Annee2 annee4 annee45 annee41 annee510 annee_saucisse banane
27. Créer le répertoire Year dans votre répertoire courant, en une commande déplacez les fichiers
précédemment créés dans le répertoire Year.
28. Lister tous les fichiers
se terminant par 5
commençant par annee4
commençant par annee4 et de 7 lettres maximum
commençant par annee avec aucun chiffre numérique
contenant la chaîne ana
commençant par a ou A
29. Copier les fichiers dont l'avant dernier caractère est un 4 ou 1 dans le répertoire /tmp en une
seule commande.
30. Afficher le nombre de sessions ouvertes (c-à-d connexions) sur la machine tout en générant le
détail de ses connexions dans le fichier connectes.
31. Afficher les L lignes qui entourent la ligne numéro N d'un fichier F. Utiliser cette méthode pour
afficher une partie du texte qui entoure la ligne où se trouve une chaîne S qu'on cherche dans un
fichier F (utiliser la commande grep).
32. Copier sur une clé USB tous les fichiers .sql modifiés ce jour.
33. Envoyer par mail à un utilisateur les noms des fichiers .sql et les fichiers .c modifiés ce jour et
dont la taille est supérieur à un kilo-octet.
34. Exécuter le script traitement se trouvant sous bin de votre répertoire de connexion :
4
@2016 Travaux pratiques – Programmation système en Shell
- Le Vendredi à 17h00
- La semaine prochaine au même moment
- Deux jours plus tard
35. Demander, de différentes manières, d'exécuter le script traitement à 16h15 le 24 février 2013,
sachant que nous somme en octobre 2012.
36. Alimenter, toutes les heures, les fichiers charge.jour.log, charge.soir.log et charge.week-end.log
du répertoire charge de votre répertoire de connexion par les informations qui donnent
respectivement la charge du système du jour, du soir des jours de la semaine et tout le week-end.
37. Envoyer tous les premiers janvier de chaque année, le courrier bonne_annee à vos
correspondants user1, user2, ...
38. 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 :
39. Soit compte 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
gestion 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.
40. Etant donné le fichier resultats :
Nom Résultats
-------------------------
Yann 104:33:48
Tudor 8:19:0
Patrick 15:98:48
5
@2016 Travaux pratiques – Programmation système en Shell
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.
41. Soit tele un fichier qui contient le répertoire téléphonique suivant :
Boileau 024867-6235
Derrick 024867-1842
Ernest 024867-1234
Grand 024867-2240
Herbrant 024867-0256
Jonathan 024867-7358
Louis 024867-3237
Tardif 024867-5341
Wagner 024867-1234
Construire un fichier NTD (nom, téléphone, département) où chaque ligne est un nom suivi du
numéro de téléphone puis du numéro de département. Comment faire pour avoir tous les noms
dans le fichier NTD ? Comment obtenir un fichier DNT où chaque ligne est composée (dans cet
ordre) du numéro de département, du nom et du numéro de téléphone ? Soit numeros le fichier
des numéros de téléphones :
024867-0256
024867-1234
024867-5555
024867-7358
Sélectionner du fichier tele les lignes où figurent les numéros du fichier ci-dessus.
6
@2016 Travaux pratiques – Programmation système en Shell
Exercice 1
# ! /bin/bash
exit 0
- ${# :-0}
- ${* :-Liste vide}
- ${1 :? ‘’Usage : $0 Nombre_1 Nombre_2 ‘’}
3) Créer un script MultDiv2 qui réalise des multiplications et des divisions successives
d’un nombre par 2. Le choix de l’opération est saisi par l’utilisateur. Le nombre
d’itérations et le nombre à traiter sont des paramètres du script. Pour réaliser ce
traitement, le script n’utilise pas les opérateurs * et /.
7
@2016 Travaux pratiques – Programmation système en Shell
Exercice 2
Ces informations sont ajoutées dans un fichier nommé Personnes. Elles sont séparées par des points-
virgules. Chaque ligne contient les données d’une personne. La structure d’une ligne du fichier est la
suivante :
Civilité ; nom ; prenom ; date de naissance ; situation familiale ; nombre d’enfants ; nationalite ;
profession
Le script effectue un tri sur le fichier avant d’en sauvegarder une copie dans le répertoire /tmp.
2) Pour éviter des erreurs de saisie d’une part et pour accélérer la saisie d’autre part,
l’utilisateur se contente de taper la première lettre concernant sa situation familiale (C pour
Célibataire, …). Le script interprète la lettre par le mot correspondant dans la base.
3) Le script précédent présente un grand inconvénient quant à la non redondance
d’informations. Remédier à ce problème en interrompant le script lorsque les informations
saisies correspondent à une ligne existante.
4) Modifier le script précédent pour donner le choix à l’utilisateur concernant la sauvegarde de
secours. Deux cas sont alors possibles :
- L’utilisateur exploite toujours le même fichier (/tmp/Personnes).
- L’utilisateur décide d’un nouveau fichier. Dans ce cas, le script demande la saisie du
nouveau nom. Si ce dernier existe, le script demande confirmation à l’utilisateur.
5) Afin de réaliser une étude sociologique sur notre population, rajouter dans votre les calculs
suivants :
- Le nombre total des personnes ;
- Le nombre total de la population masculine ;
- Le nombre total de la population féminine ;
- Le nombre total de personnes par situation familiale et leur répartition sur les deux
populations ;
- La moyenne d’âge des deux opérations ;
- La répartition homme/femme par catégorie socioprofessionnelle.
6) Votre script doit réaliser les opérations suivantes :
- Consulter la base de données (1) ;
- Consulter les informations d’une personne (2) ;
- Ajouter une personne (3) ;
- Supprimer une personne (4).
8
@2016 Travaux pratiques – Programmation système en Shell
Pour cela, le script est lancé avec un numéro d’opération (1, 2, 3 ou 4). Si le numéro ne correspond
pas à un choix possible, le script demande à l’utilisateur de saisir un choix.
A la fin de chaque traitement, le script demande à l’utilisateur s’il veut recommencer avec une autre
opération ou s’il souhaite quitter le programme. Si l’utilisateur répond à la question par la lettre N ou
n, le programme se termine, sinon le script recommence la saisie de l’opération à traiter.
Exercice 3
1) Ecrire un script Recherche qui effectue une recherche de fichier en fonction du nom et du
type du fichier. Le script est lancé avec les paramètres suivants :
a. Le nom du fichier concerné par la recherche ;
b. Le nom du répertoire où s’effectue la recherche ;
c. Une option qui indique le type du fichier. Les options possibles sont : -f (fichier
ordinaire), -d (répertoire), -l (lien symbolique), -b (fichier spécial bloc) et –c (fichier
spécial caractère).
2) Ecrire un script Recherche_user qui effectue une recherche d’un nom d’utilisateur dans des
fichiers système selon l’option mentionnée. Les options possibles sont :
Exercice 4
1) Ecrire un script InputOutput qui lit une entrée depuis un fichier spécifié par l’utilisateur.
Chaque ligne du script sera précédée d’un numéro de ligne et affichée dans un fichier de
sortie indiqué par l’utilisateur. Toute instruction read dans le script doit ignorer les E/S
standard et travailler uniquement avec les deux fichiers transmis en paramètre du script.
Réaliser les redirections à l’intérieur du script.
2) Modifier le script précédent de manière à ce que la redirection soit effectuée sur la ligne de
commande. Le nom du nouveau script est : InputOutputCmd.
3) Ecrire un script qui lit depuis le fichier /etc/passwd et qui sépare les champs par des
tabulations. Le résultat est redirigé vers le fichier donné en argument au script.
4) Exécuter le script suivant :
# ! /bin/bash
exec 3> Output1
exec 4< /etc/group
while read –u4 ligne
do
IFS= :
set $ligne
print –u3 ‘’$1\t$2\t$3\t$4 ‘’
done
exit 0
9
@2016 Travaux pratiques – Programmation système en Shell
- Est-ce que le fichier Output1 a été créé ?
- Si oui, afficher son contenu.
- Que se passe-t-il si l’option –u4 est omise dans l’instruction read ?
- Que se passe-t-il si l’option –u3 est omise dans l’instruction print ?
Exercice 5
1) Rédiger les instructions qui permettent d’afficher sur l’écran le menu suivant :
Une fois ces informations saisies, vous devez les sauvegarder dans un fichier dont le nom est
défini dans la variable fichier_salaries au début du script. Les différentes informations sont
séparées par le caractère ‘ ; ‘ pour pouvoir exporter ces données vers d’autres logiciels
comme Excel ou d’autres systèmes de gestion de bases de données.
4) Toutes les informations saisies peuvent être modifiées. Les nouvelles données sont vérifiées
et validées avant leur enregistrement dans la base.
5) Afficher les informations d’un salarié.
6) Afficher les informations de tous les salariés.
7) Supprimer les informations concernant un salarié.
8) Quitter l’application après avoir demandé une confirmation de la part de l’utilisateur.
10
@2016 Travaux pratiques – Programmation système en Shell
Exercice 6
Exercice 7
1) A l’aide la commande awk, afficher l’état d’un processus, son numéro PID et son nom.
2) Afficher l’année courante.
3) Afficher les noms de connexion et leur numéro UID. Les lignes sont numérotées dans un
ordre croissant.
4) Afficher le plus gros UID en dehors 65536.
5) Afficher le plus gros GID en dehors du GID 65536.
6) Afficher la liste des fichiers de votre répertoire courant et leurs permissions.
7) Afficher le contenu du fichier /etc/passwd en remplaçant le caractère ‘ : ‘ par une tabulation.
Exercice 8
11
@2016 Travaux pratiques – Programmation système en Shell
11) Afficher la taille totale de votre répertoire courant.
12) Du fichier /etc/passwd, afficher en majuscule les logins des comptes utilisateurs qui ont un
UID supérieur à 100. Le format de l’affichage vous est imposé :
<login sur 20 caractères> a pour UID <uid>
L’exécution vous est aussi imposée :
$ awk –f traitement.awk /etc/passwd
Exercice 9
1) Ecrire un script TaillePart qui affiche la capacité totale utilisée sur l’ensemble des partitions.
2) Ecrire un script Total qui affiche le nombre de lignes de tous les fichiers de même extension
qui se trouvent dans une arborescence. L’extension des fichiers et de l’arborescence sont des
paramètres transmis au script.
Exemple : $ ./Total /etc conf
3) Créer un fichier de traitement exploitable par la commande awk afin d’afficher la deuxième
partie de l’adresse mail (le nom du domaine réseau). Il est demandé d’utiliser les fonctions
internes de la commande awk : substr, length, index.
$ cat Adresses
Exercice 10
1) Ecrire une fonction Existe qui recherche un utilisateur dans un fichier. Le choix du fichier est
défini par une option qui est transmise à la fonction. Si l’option est égale à la lettre ‘u ‘, la
recherche s’effectue dans le fichier /etc/passwd. Si l’option est égale à la lettre ‘g ‘, la
recherche s’effectue dans le fichier /etc/group. La fonction transmet un code de retour égal à
0 en cas de succès et à 1 autrement.
12
@2016 Travaux pratiques – Programmation système en Shell
2) Ecrire une fonction Saisie qui permet de lire à partir du clavier :
- Un nom d’utilisateur si l’option transmise est ‘u’.
- Un nom de groupe si l’option transmise est ‘g’.
Exercice 11
Exercice 12
Exercice 13
13
@2016 Travaux pratiques – Programmation système en Shell