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