Newer
Older
cours-unix-shell / output / shell / tp.html
<!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">&quot;&lt;exodic &quot;</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">&quot;n&#39;existe pas (ou n&#39;est pas un fichier).&quot;</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">&quot;&lt;exodic &quot;</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">&gt;</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=&quot;type&quot;</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">&#39;dcvalue element=&quot;type&quot;&#39;</span> <span class="op">&gt;&gt;</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>&gt;&gt;</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">&quot;</span><span class="va">$KEY</span><span class="st">&quot;</span> <span class="op">&gt;</span> <span class="va">${REP}</span>/<span class="va">$NAME</span>.txt
        <span class="kw">done</span> <span class="op">&lt;</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>&copy; CNRS 2023</p>
    </footer>
</body>

</html>