TP ‐ Bash - vbridonneau/CoursSysteme GitHub Wiki

TP - Bash

L'objectif de ce TP est de manipuler et d'exécuter des instuctions shell.

Echauffement

Commandes intermédiaires

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`
  1. Utilisez cette syntaxe pour stocker dans une variable le nombre de caracèteres contenus dans un fichier de votre choix.
  2. Affichez ensuite avec la commande echo le message mon fichier contient ... caractères.

Sous bash

Exécutez la commande suivante :

(cd .. && ls)

Que se passe-t-il ? Pourquoi ?

Tuer des commandes

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.

Ctrl + C

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

  1. Lancez la commande sleep 5 et tuez la avant que celle-ci n'atteigne la fin de son exécution.

La commande `kill` et la commande `pkill`

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.

  1. Lancez la commande ps pour obtenir le PID du processus et passez le en argument de la commande kill.

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.

  1. Relancez la commande sleep 5 & puis lancez la commande pkill sleep.

Exercices

ls des fichiers uniquement

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

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

Recherches de fichier avec find

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.

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

Extraction de donnée

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.

  1. 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 variable fichier et le second dans une variable motif.

Nous allons maintenant extraire le nom des villes et les placer dans un fichier tmpVilles.csv.

  1. 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 commandes cat et cut ainsi qu'au moins une pipeline |. Redirigez la sortie de votre commande dans le fichier tmpVilles.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.

  1. En utilisant les commandes grep et wc, é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 commande echo.

Test

Testez votre script pour chercher :

  1. Le nombre de villes commençant par la lettre S
  2. Le nombre de villes finissant par la lettre e
  3. Le nombre de villes commençant par une lettre entre A et E et/ou finissant par la lettre s.
  • Bonus : réécrivez votre script en une commande bash. Vous n'avez pas besoin de stocker les villes dans un fichier temporaire.
⚠️ **GitHub.com Fallback** ⚠️