Newer
Older
cours-unix-shell / UnixShell_cours2018 / tpShell.fre.html
<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&eacute; &eacute;quivalent &agrave; 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&egrave;tres"><link rel="section" href="testShell.fre.html" title="Tests"><link rel="section" href="structureShell.fre.html" title="Structures de contr&ocirc;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&eacute;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&egrave;tres</a></li>
	    <li><a href="testShell.fre.html">Tests</a></li>
	    <li><a href="structureShell.fre.html">Structures de contr&ocirc;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&eacute;&eacute;s par la suite
      devront avoir le droit d'ex&eacute;cution correctement
      positionn&eacute;, au moins pour leur propri&eacute;taire.
    </p>

    <h2>
      Recherche d'information sur un utilisateur
    </h2>
    <ol><a name="name_fichier"></a>
      <li>
	<p>
	  &Eacute;crivez un script shell <code>infouser.sh</code> qui permette de chercher si
	  un utilisateur d'un nom donn&eacute; existe sur votre
	  machine, en affichant sa r&eacute;f&eacute;rence
	  compl&egrave;te (c'est-&agrave;-dire sans aucun
	  filtrage).<br>
	
	  Le nom recherch&eacute; sera pass&eacute; comme param&egrave;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&egrave;tre
	  est bien pass&eacute; en ligne. En cas d'erreur (aucun
	  param&egrave;tre ou plus d'un), un message sera
	  affich&eacute; expliquant la bonne syntaxe &agrave;
	  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&eacute;cup&eacute;rer
      le corpus suivant&nbsp;:<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&eacute;e,
      son exploration pr&eacute;paratoire est conseill&eacute;e.
    </p>

    <ol>
	<a name="name_resume1"></a>
      <li>
	<p>
	  &Eacute;crivez un script shell qui compte le nombre de notices, 
    en passant le nom de fichier en param&egrave;tre.<br>

	  L'&eacute;l&eacute;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 "&lt;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&eacute;c&eacute;dent pour qu'il teste en plus
	  l'existence du fichier demand&eacute; avant traitement, puis
	  pour qu'il sorte les r&eacute;sultats dans un fichier
	  nomm&eacute; <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 "&lt;exodic " | wc -l`

echo Nombre de notices dans $1: ${NB_NOTICES} > resultats.txt</pre>
	  <p class="remarque">
	    Cette fois, on a mis la cha&icirc;ne contenant les apostrophes
	    (caract&egrave;re sp&eacute;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&eacute;pertoires 
    pour afficher le type de document des notices qui y sont pr&eacute;sentes.
    <br>
    Il faut d'abord r&eacute;cup&eacute;rer le fichier 
    <a href="data_dc.tar.gz"><code>data_dc.tar.gz</code></a>.
    <br><br>
    Votre shell devra d&eacute;compresser puis installer l'archive du fichier 
    <code>tar</code> sous <code>Formation/TP_dc</code>.<br>
    Cela donnera un r&eacute;pertoire <code>dc</code> contenant 5 r&eacute;pertoires 
    nomm&eacute;s de <code>1</code> &agrave; <code>5</code>.<br>
    Ces sous-r&eacute;pertoires contiennent chacun un fichier <code>dublin_core.xml</code> 
    avec une seule notice (qu'il est conseill&eacute; d'aller regarder).<br>
    <br>
    Ces op&eacute;rations r&eacute;alis&eacute;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&eacute;e, les r&eacute;sultats seront &eacute;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&icirc;ne contenant les guillemets
	    (caract&egrave;re sp&eacute;cial) entre apostrophes pour les banaliser.
	  </p>
	  <p class="remarque">
	    On utilise une double redirection en sortie <code>&gt;&gt;</code> car
      il faut concat&eacute;ner les diff&eacute;rentes op&eacute;rations 
      d'&eacute;criture dans le fichier r&eacute;sultat.
	  </p>

	<a name="name_resume4"></a>
      <li>
	<p>
	  &Eacute;crivez un script shell qui utilise un fichier de cl&eacute;s de
    s&eacute;lection avec grep sur un fichier de DOI, pour r&eacute;cup&eacute;rer chaque 
    s&eacute;lection dans un fichier r&eacute;sultat diff&eacute;rent. Les noms 
    de ces fichiers r&eacute;sultats contiendront la valeur de la cl&eacute; de 
    s&eacute;lection.<br>
	  Le fichier de cl&eacute;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&egrave;res
      de s&eacute;lection, le traitement se d&eacute;roule sous Unix/Linux. Par 
      cons&eacute;quent, il faut prendre garde aux fins de ligne qui doivent
      &ecirc;tre de type Unix (<code>\n</code>). La pr&eacute;sence de fins de
      ligne de type Windows (<code>\r\n</code>) perturbe les op&eacute;rations 
      de s&eacute;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>