<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link REL="STYLESHEET" TYPE="text/css" TITLE="Style DILIB" HREF="../../dilib.css"> <style type="text/css"> pre.script { font-size: smaller; } .chaine { background-color: #B0E0FF; color: green; } .chaine:before { content: "«"; } .chaine:after { content: "»"; } .attention { font-style: italic; } .remarque, .exemple, .remarque_suite { font-size: smaller; } .remarque { margin-bottom: 2; } .remarque_suite { margin-bottom: 2; margin-top: 0; } .remarque:before { content: "REMARQUE :"; } .exemple:before { content: "Exemple : "; } .attention:before { content: "ATTENTION :"; } .solution { display: none; } </style> <script type="text/javascript"> /* nom du fichier contenant le corrigé équivalent à celui de ce fichier */ var corrige='corrigeShell.fre.html'; </script> <script type="text/javascript" src="cacher.js"></script> <title>TP shell - UNIX</title> <link rel="copyright" href="http://www.inist.fr/"><link rel="author" href="http://dilib.inist.fr/membres.html"><link rel="chapter" href="caracteristiques.fre.html" title="UNIX"><link rel="chapter" href="X.fre.html" title="X Window"><link rel="chapter" href="redirPipes.fre.html" title="Rappels"><link rel="chapter" href="newCommandsUser.fre.html" title="Commandes UNIX"><link rel="chapter" href="shellVars.fre.html" title="Shell"><link rel="chapter" href="sed.fre.html" title="Sed"><link rel="chapter" href="make.fre.html" title="Make"><link rel="index" href="http://dilib.inist.fr/dilib/v04Main/IndexSite/Server/FR.resource.index.html"><link rel="top" title="Accueil de DILIB" href="http://dilib.inist.fr/dilib/v04Main/"><link rel="alternate" title="English version" href="tpShell.eng.html"><link rel="up" href="index.fre.html" title="Tutorial UNIX / Shell"> <link rel="section" href="shellVars.fre.html" title="Variables d'environnement"><link rel="section" href="shellScript.fre.html" title="Scripts"><link rel="section" href="paramShell.fre.html" title="Paramètres"><link rel="section" href="testShell.fre.html" title="Tests"><link rel="section" href="structureShell.fre.html" title="Structures de contrôle"><link rel="section" href="commandeShell.fre.html" title="Commandes diverses"><link rel="section" href="tpShell.fre.html" title="Travaux Pratiques"> <link rel="first" href="caracteristiques.fre.html" title="Caractéristiques d'UNIX"> <link rel="previous" href="commandeShell.fre.html" title="Commandes diverses"> <link rel="next" href="sed.fre.html" title="Sed"> <link rel="last" href="tpShell.fre.html" title="Travaux Pratiques"> </head> <body> <h1>TP shell - UNIX</h1> <div id="navcontainer"> <ul id="navlist"> <li><a href="caracteristiques.fre.html">UNIX</a> </li> <li><a href="redirPipes.fre.html">Bases</a> </li> <li><a href="newCommandsUser.fre.html">Commandes</a> </li> <li><a>Shell</a> <ul id="subnavlist"> <li><a href="shellVars.fre.html">Variables d'environnement</a></li> <li><a href="shellScript.fre.html">Scripts</a></li> <li><a href="paramShell.fre.html">Paramètres</a></li> <li><a href="testShell.fre.html">Tests</a></li> <li><a href="structureShell.fre.html">Structures de contrôle</a></li> <li><a href="commandeShell.fre.html">Commandes</a></li> <li><a href="tpShell.fre.html" id="subcurrent">TP</a></li> </ul> </li> <li><a href="sed.fre.html">Sed</a> </li> <li><a href="make.fre.html">Make</a> </li> </ul> </div> <div class="content"> <p class="remarque"> 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> <h2> Recherche d'information sur un utilisateur </h2> <ol><a name="name_fichier"></a> <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> <script type="text/javascript"> EcrireBouton('fichier'); </script> <div class="solution" id="fichier"> <a href="javascript:Cacher('fichier');">Cacher la solution</a> <p class="remarque"> 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> <pre class="script"><span class="comment">#!/bin/sh</span> grep $1 /etc/passwd</pre> </div> </li> <a name="name_param1"></a> <li> <p> Modifiez ce shell pour qu'il teste si un paramètre est bien passé en ligne. En cas d'erreur (aucun paramètre ou plus d'un), un message sera affiché expliquant la bonne syntaxe à suivre. </p> <script type="text/javascript"> EcrireBouton('param1'); </script> <div class="solution" id="param1"> <a href="javascript:Cacher('param1');">Cacher la solution</a> <pre class="script"><span class="comment">#!/bin/sh</span> if test $# -ne 1 then echo Mauvais nombre de parametres. echo echo Usage: $0 uid exit 1 fi grep $1 /etc/passwd</pre> </div> </li> </ol> <h2> Quelques manipulations sur un corpus XML </h2> <p> Pour cette partie du TP, il vous faut d'abord récupérer le corpus suivant :<br> <a href="francis.exodic.xml"><code>francis.exodic.xml</code></a> <br> Ce fichier contient 20 notices en XML Exodic, dans une forme indentée, son exploration préparatoire est conseillée. </p> <ol> <a name="name_resume1"></a> <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> <script type="text/javascript"> EcrireBouton('resume1'); </script> <div class="solution" id="resume1"> <a href="javascript:Cacher('resume1');">Cacher la solution</a> <pre class="script"><span class="comment">#!/bin/sh</span> if test $# -ne 1 then echo Mauvais nombre de parametres. echo echo Usage: $0 fichier exit 1 fi NB_NOTICES=`cat $1 | grep "<exodic " | wc -l` echo Nombre de notices dans $1: ${NB_NOTICES}</pre> </div> </li> <a name="name_resume2"></a> <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> <script type="text/javascript"> EcrireBouton('resume2'); </script> <div class="solution" id="resume2"> <a href="javascript:Cacher('resume2');">Cacher la solution</a> <pre class="script"><span class="comment">#!/bin/sh</span> if test $# -ne 1 then echo Mauvais nombre de parametres. echo echo Usage: $0 fichier exit 1 fi if test ! -f $1 then echo $1 "n'existe pas (ou n'est pas un fichier)." exit 2 fi NB_NOTICES=`cat $1 | grep "<exodic " | wc -l` echo Nombre de notices dans $1: ${NB_NOTICES} > resultats.txt</pre> <p class="remarque"> Cette fois, on a mis la chaîne contenant les apostrophes (caractère spécial) entre guillemets pour les banaliser. </p> </div> </li> <a name="name_resume3"></a> <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="data_dc.tar.gz"><code>data_dc.tar.gz</code></a>. <br><br> Votre shell devra décompresser puis installer l'archive du fichier <code>tar</code> sous <code>Formation/TP_dc</code>.<br> Cela donnera un répertoire <code>dc</code> contenant 5 répertoires nommés de <code>1</code> à <code>5</code>.<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).<br> <br> 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>. <br> </p> <script type="text/javascript"> EcrireBouton('resume3'); </script> <div class="solution" id="resume3"> <a href="javascript:Cacher('resume3');">Cacher la solution</a> <pre class="script"><span class="comment">#!/bin/sh</span> # En etant dans le repertoire Formation/TP_dc gunzip data_dc.tar.gz tar -xvf data_dc.tar for FILE in dc/*/*.xml do cat $FILE | grep 'dcvalue element="type"' >> typesDC.txt done </div> <p class="remarque"> Cette fois, on a mis la chaîne contenant les guillemets (caractère spécial) entre apostrophes pour les banaliser. </p> <p class="remarque"> 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. </p> <a name="name_resume4"></a> <li> <p> Écrivez un script shell qui utilise un fichier de clés de sélection avec grep sur un fichier de DOI, pour récupérer chaque sélection dans un fichier résultat différent. Les noms de ces fichiers résultats contiendront la valeur de la clé de sélection.<br> Le fichier de clés est <a href="listeCles.txt"><code>listeCles.txt</code></a>.<br> Le fichier à filtrer est <a href="listeDOI.txt.gz"><code>listeDOI.txt.gz</code></a>. </p> <script type="text/javascript"> EcrireBouton('resume4'); </script> <div class="solution" id="resume4"> <a href="javascript:Cacher('resume4');">Cacher la solution</a> <pre class="script"><span class="comment">#!/bin/sh</span> export LC_COLLATE=C REP=. while read KEY do NAME=selection_$KEY zcat listeDOI.txt.gz | grep "$KEY" > ${REP}/$NAME.txt done < $REP/listeCles.txt </pre> </div> <p class="remarque"> 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>). 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> </li> </ol> <hr> <address><a href="mailto:philippe.houdry@inist.fr">Philippe.Houdry@inist.fr</a></address> </body> </html>