TP ‐ Bash - vbridonneau/CoursSysteme GitHub Wiki
L'objectif de ce TP est de manipuler et d'exécuter des instuctions shell.
Lorsque l'on souhaite récupérer le résultat d'une commande dans une variable ou pour une boucle for
, il peut être intéressant d'utiliser la syntaxe suivante :
MA_VARIABLE=`commande`
- Utilisez cette syntaxe pour stocker dans une variable le nombre de caracèteres contenus dans un fichier de votre choix.
- Affichez ensuite avec la commande echo le message
mon fichier contient ... caractères
.
Exécutez la commande suivante :
(cd .. && ls)
Que se passe-t-il ? Pourquoi ?
Dans cet exercice, on se propose de tuer des processus. Les processus sont des programmes en cours d'exécution sur une machine. Nous allons voir deux manières de tuer des processus.
Pour tuer une commande en cours d'exécution dans un terminal il suffit d'appuyer sur les touches Ctrl + C
(ou ^C
en abrégé).
- Lancez la commande
sleep 5
et tuez la avant que celle-ci n'atteigne la fin de son exécution.
Il est également possible de tuer des processus via les commandes kill
et pkill
.
Le première necéssite l'identifiant du processus.
Nous aurons l'occasion de voir plus en détail de quoi il s'agit plus tard.
Pour le moment, reprenons notre commande sleep 5
.
Cette fois-ci, on va rajouter le symbole &
à la fin de la commande.
La commande est alors lancée et placée en arrière plan.
On peut donc reprendre la main et continuer d'exécuter d'autres commandes.
Par exemple, tuer la commande sleep
que l'on vient de lancer.
Pour récuperer l'identifiant d'un processus (aussi appelé PID) on peut exécuter la commande ps
.
- Lancez la commande
ps
pour obtenir le PID du processus et passez le en argument de la commandekill
.
On vient de tuer la commande sleep que l'on avait lancée.
Il est également possible de tuer des processus par leur nom avec la commande pkill
suivit d'un nom de commande.
- Relancez la commande
sleep 5 &
puis lancez la commandepkill sleep
.
Notre objectif est ici d'écrire un script bash afin que celui-ci parcourt avec une boucle for
tous les fichiers d'un répertoire et n'affiche dans le terminal que les fichiers (pas les répertoires).
Pour cela, nous allons procéder en deux temps.
Premièrement, nous allons nous concentrer sur la boucle for
.
Pour rappel, la syntaxe d'une boucle for
est la suivante :
for variable in # Une séquence
do
# Commandes
done
- Utilisez cette syntaxe pour faire une boucle sur les fichiers du répertoire. On supposera que, dans notre script, cette donnée et passé en paramètre via le premier argument.
Il ne nous reste plus qu'à tester.
- En utilisant un test, vérifiez que le fichier en train d'être parcouru est bien un fichier régulier (et pas un répertoire) et si tel est le cas, affichez son nom dans le terminal.
Notre objectif est de créer un script bash permettant de calculer la taille de tous les fichiers objets produit par gcc
à partir d'un .c
(avec l'extension .o
) depuis un répertoire avec la commande find
.
Pour cela nous allons utiliser la commande find afin de trouver tous les fichiers ayant l'extension ".o" et d'y appliquer la commande du
.
- La syntaxe de cette commande est la suivant :
find REP \( -name MOTIF \) -exec COMMAND {} +
Completez afin que la commande affiche la taille de chaque fichier de façon à ce que ce soit lisible par un humain.
L'objectif est ici de manipuler les données d'un fichier afin d'en extraire certaines informations.
On se propose ici de manipuler le contenue de fichiers au format csv
(Comma Separated Value).
Ces fichiers contiennent des données sous formes de colonnes, chacune étant séparée par des virgules ','.
La première ligne sert à nommer les colonnes afin de leur donner un sens.
Les lignes suivantes correspondent aux données.
Voici un exemple de fichier donnant des villes ainsi que leur département (les données proviennent du site suivant) :
dep,nom,cp,nb_hab_2010,nb_hab_1999,nb_hab_2012,dens,surf,long,lat,alt_min,alt_max
1,Ozan,1190,618,469,500,93,6.6,4.91667,46.3833,170,205
1,Cormoranche-sur-Saône,1290,1058,903,1000,107,9.85,4.83333,46.2333,168,211
1,Plagne,1130,129,83,100,20,6.2,5.73333,46.1833,560,922
1,Tossiat,1250,1406,1111,1400,138,10.17,5.31667,46.1333,244,501
Notre objectif va être de créer un script capable d'extraire le nom des villes et de compter combien il en existe respectant certaines conditions. Notre script devra prendre exactement deux paramètres, le fichier contenant les villes ainsi que le motif à rechercher, et afficher dans le terminal le nombre de ville respectant ce motif.
- Créez un script bash
recherche.sh
. Dans ce script, vous commencerez par récupérer les deux paramètres en vous assurant au préalable que l'utilisateur a bien passé exactement deux paramètres. Vous stockerez le premier paramètre dans une variablefichier
et le second dans une variablemotif
.
Nous allons maintenant extraire le nom des villes et les placer dans un fichier tmpVilles.csv
.
- Ajoutez à votre script une commande bash permettant de récupérer le nom des villes.
Pour vous aidez, vous pourrez utiliser le fait que dans ce fichier, le nom des villes est dans la deuxième colonne et que le séparateur de donnée est la virgule
,
. Votre commande devra utiliser les commandescat
etcut
ainsi qu'au moins une pipeline|
. Redirigez la sortie de votre commande dans le fichiertmpVilles.csv
en utilisant le caractère>
.
Maintenant que l'on a récupéré le nom des villes dans un fichier, il ne nous reste plus qu'à rechercher le motif dans le nouveau fichier.
- En utilisant les commandes
grep
etwc
, écrivez une commande qui compte le nombre de fois que le motif passé en paramètre est trouvé dans le nom des villes. Stockez le résultat de cette commande dans une variable villeMotif et affichez ensuite la valeur de cette variable dans le terminal avec la commandeecho
.
Testez votre script pour chercher :
- Le nombre de villes commençant par la lettre
S
- Le nombre de villes finissant par la lettre
e
- Le nombre de villes commençant par une lettre entre
A
etE
et/ou finissant par la lettres
.
- Bonus : réécrivez votre script en une commande bash. Vous n'avez pas besoin de stocker les villes dans un fichier temporaire.