<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1></h1>
<nav>
<ul>
<li><a href="/output/README.html">Accueil</a></li>
<li><a href="/output/unix/README.html">UNIX</a></li>
<li><a href="/output/bases/README.html">Bases</a></li>
<li><a href="/output/commandes/README.html">Commandes</a></li>
<li><a href="/output/shell/README.html">Shell</a></li>
<li><a href="/output/sed/README.html">Sed</a></li>
<li><a href="/output/make/README.html">Make</a></li>
</ul>
</nav>
</header>
<div class="content">
<h1 id="travaux-pratiques---shell---unix">Travaux pratiques - Shell - UNIX</h1>
<blockquote>
<p>⚠ Tous les shells qui seront créés par la suite devront avoir le droit d'exécution correctement positionné, au moins pour leur propriétaire.</p>
</blockquote>
<h2 id="recherche-dinformation-sur-un-utilisateur">Recherche d'information sur un utilisateur</h2>
<ol type="1">
<li><p>Écrivez un script shell <code>infouser.sh</code> qui permette de chercher si un utilisateur d'un nom donné existe sur votre machine, en affichant sa référence complète (c'est-à-dire sans aucun filtrage).<br />
Le nom recherché sera passé comme paramètre au shell.<br />
La recherche portera dans le fichier <code>/etc/passwd</code>.</p>
<p><details> <summary>Voir la solution</summary></p>
<blockquote>
<p>⚠ Comme d'habitude quand on veut traiter un fichier, il vaut mieux visionner son contenu, avant de vouloir l'exploiter (<code>more /etc/passwd</code>).</p>
</blockquote>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="co">#!/bin/sh</span>
<span class="fu">grep</span> <span class="va">$1</span> /etc/passwd</code></pre></div>
<p></detais></p></li>
<li><p>Modifiez ce shell pour qu'il teste si un paramètre est bien passé en ligne.<br />
En cas d'erreur (aucun paramètre ou plus d'un), un message sera affiché expliquant la bonne syntaxe à suivre.</p>
<p><details> <summary>Voir la solution</summary></p>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="co">#!/bin/sh</span>
<span class="kw">if</span> <span class="bu">test</span> <span class="va">$#</span> -ne 1
<span class="kw">then</span>
<span class="bu">echo</span> Mauvais nombre de parametres.
<span class="bu">echo</span>
<span class="bu">echo</span> Usage: <span class="va">$0</span> uid
<span class="bu">exit</span> 1
<span class="kw">fi</span>
<span class="fu">grep</span> <span class="va">$1</span> /etc/passwd</code></pre></div>
<p></details></p></li>
</ol>
<h2 id="quelques-manipulations-sur-un-corpus-xml">Quelques manipulations sur un corpus XML</h2>
<p>Pour cette partie du TP, il vous faut d'abord récupérer le corpus suivant : <a href="../UnixShell_cours2018/francis.exodic.xml"><code>francis.exodic.xml</code></a></p>
<p>Ce fichier contient 20 notices en XML Exodic, dans une forme indentée, son exploration préparatoire est conseillée.</p>
<ol type="1">
<li><p>Écrivez un script shell qui compte le nombre de notices, en passant le nom de fichier en paramètre.<br />
L'élément racine se nomme <code>exodic</code>.</p>
<p><details> <summary>Voir la solution</summary></p>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="co">#!/bin/sh</span>
<span class="kw">if</span> <span class="bu">test</span> <span class="va">$#</span> -ne 1
<span class="kw">then</span>
<span class="bu">echo</span> Mauvais nombre de parametres.
<span class="bu">echo</span>
<span class="bu">echo</span> Usage: <span class="va">$0</span> fichier
<span class="bu">exit</span> 1
<span class="kw">fi</span>
<span class="va">NB_NOTICES=</span><span class="kw">`</span><span class="fu">cat</span> <span class="va">$1</span> <span class="kw">|</span> <span class="fu">grep</span> <span class="st">"<exodic "</span> <span class="kw">|</span> <span class="fu">wc</span> -l<span class="kw">`</span>
<span class="bu">echo</span> Nombre de notices dans <span class="va">$1</span>: <span class="va">${NB_NOTICES}</span></code></pre></div>
<p></details></p></li>
<li><p>Modifiez le shell précédent pour qu'il teste en plus l'existence du fichier demandé avant traitement, puis pour qu'il sorte les résultats dans un fichier nommé <code>resultats.txt</code>.</p>
<p><details> <summary>Voir la solution</summary></p>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="co">#!/bin/sh</span>
<span class="kw">if</span> <span class="bu">test</span> <span class="va">$#</span> -ne 1
<span class="kw">then</span>
<span class="bu">echo</span> Mauvais nombre de parametres.
<span class="bu">echo</span>
<span class="bu">echo</span> Usage: <span class="va">$0</span> fichier
<span class="bu">exit</span> 1
<span class="kw">fi</span>
<span class="kw">if</span> <span class="bu">test</span> ! -f <span class="va">$1</span>
<span class="kw">then</span>
<span class="bu">echo</span> <span class="va">$1</span> <span class="st">"n'existe pas (ou n'est pas un fichier)."</span>
<span class="bu">exit</span> 2
<span class="kw">fi</span>
<span class="va">NB_NOTICES=</span><span class="kw">`</span><span class="fu">cat</span> <span class="va">$1</span> <span class="kw">|</span> <span class="fu">grep</span> <span class="st">"<exodic "</span> <span class="kw">|</span> <span class="fu">wc</span> -l<span class="kw">`</span>
<span class="bu">echo</span> Nombre de notices dans <span class="va">$1</span>: <span class="va">${NB_NOTICES}</span> <span class="op">></span> resultats.txt</code></pre></div>
<blockquote>
<p>⚠ Cette fois, on a mis la chaîne contenant les apostrophes (caractère spécial) entre guillemets pour les banaliser.</p>
</blockquote>
<p></details></p></li>
<li><p>Installer et parcourir des fichiers dublin core d'un arbre de répertoires pour afficher le type de document des notices qui y sont présentes.<br />
Il faut d'abord récupérer le fichier <a href="../UnixShell_cours2018/data_dc.tar.gz"><code>data_dc.tar.gz</code></a>.</p>
<p>Votre shell devra décompresser puis installer l'archive du fichier tar sous <code>Formation/TP_dc</code>.<br />
Cela donnera un répertoire <code>dc</code> contenant 5 répertoires nommés de 1 à 5.<br />
Ces sous-répertoires contiennent chacun un fichier <code>dublin_core.xml</code> avec une seule notice (qu'il est conseillé d'aller regarder).</p>
<p>Ces opérations réalisées, la suite du shell devra chercher le type de document de chaque notice, identifiable avec <code>dcvalue element="type"</code>.<br />
Cette information trouvée, les résultats seront écrits dans le fichier <code>typesDC.txt</code>.</p>
<p><details> <summary>Voir la solution</summary></p>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="co">#!/bin/sh</span>
<span class="co"># En etant dans le repertoire Formation/TP_dc</span>
<span class="fu">gunzip</span> data_dc.tar.gz
<span class="fu">tar</span> -xvf data_dc.tar
<span class="kw">for</span> <span class="ex">FILE</span> in dc/*/*.xml
<span class="kw">do</span>
<span class="fu">cat</span> <span class="va">$FILE</span> <span class="kw">|</span> <span class="fu">grep</span> <span class="st">'dcvalue element="type"'</span> <span class="op">>></span> typesDC.txt
<span class="kw">done</span></code></pre></div>
<blockquote>
<p>⚠ Cette fois, on a mis la chaîne contenant les guillemets (caractère spécial) entre apostrophes pour les banaliser.</p>
</blockquote>
<blockquote>
<p>⚠ On utilise une double redirection en sortie <code>>></code> car il faut concaténer les différentes opérations d'écriture dans le fichier résultat. </details></p>
</blockquote></li>
<li><p>Écrivez un script shell qui utilise un fichier de clés de sélection avec <code>grep</code> sur un fichier de DOI, pour récupérer chaque sélection dans un fichier résultat différent.<br />
Les noms de ces fichiers résultats contiendront la valeur de la clé de sélection. Le fichier de clés est <a href="../UnixShell_cours2018/listeCles.txt"><code>listeCles.txt</code></a>.<br />
Le fichier à filtrer est <a href="../UnixShell_cours2018/listeDOI.txt.gz"><code>listeDOI.txt.gz</code></a>.</p>
<p><details> <summary>Voir la solution</summary></p>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="co">#!/bin/sh</span>
<span class="bu">export</span> <span class="va">LC_COLLATE=</span>C
<span class="va">REP=</span>.
<span class="kw">while</span> <span class="bu">read</span> <span class="va">KEY</span>
<span class="kw">do</span>
<span class="va">NAME=</span>selection_<span class="va">$KEY</span>
<span class="fu">zcat</span> listeDOI.txt.gz <span class="kw">|</span> <span class="fu">grep</span> <span class="st">"</span><span class="va">$KEY</span><span class="st">"</span> <span class="op">></span> <span class="va">${REP}</span>/<span class="va">$NAME</span>.txt
<span class="kw">done</span> <span class="op"><</span> <span class="va">$REP</span><span class="ex">/listeCles.txt</span></code></pre></div>
<p></details></p>
<blockquote>
<p>⚠ Il est important de noter que, surtout pour le fichier des critères de sélection, le traitement se déroule sous Unix/Linux. Par conséquent, il faut prendre garde aux fins de ligne qui doivent être de type Unix (<code>\n</code>).<br />
La présence de fins de ligne de type Windows (<code>\r\n</code>) perturbe les opérations de sélection comme avec <code>grep</code> (matching incorrect).</p>
</blockquote></li>
</ol>
<p><a href="./commandes.html">Précédent</a> - <a href="../sed/README.html">Suivant</a></p>
</div>
<footer>
<p>© CNRS 2023</p>
</footer>
</body>
</html>