Scripts shell - exercice 3 - trier les informations dans un fichier, récupérer ce qui est pertinent et présenter les résultats
Titre : Trier les informations dans un fichier, récupérer ce qui est pertinent et présenter les résultats
Matériel :
==========================
1. Voici le fichier à traiter (créer un fichier appeler donnees3.csv sur votre machine) :
GROUPE1;APPLI1;HOSTNAME1;STATUS1;LEVEL1; Alerte de type 1;20080101
GROUPE2;APPLI2;HOSTNAME2;STATUS2;LEVEL2; Alerte de type 7;20080102
GROUPE3;APPLI3;HOSTNAME3;STATUS3;LEVEL3; Alerte de type 3;20080103
GROUPE4;APPLI4;HOSTNAME4;STATUS4;LEVEL4; Alerte de type 7;20080104
GROUPE5;APPLI5;HOSTNAME5;STATUS5;LEVEL5; Alerte de type 5;20080105
GROUPE6;APPLI6;HOSTNAME6;STATUS6;LEVEL6; Alerte de type 8;20080106
GROUPE7;APPLI4;HOSTNAME4;STATUS7;LEVEL7; Alerte de type 7;20080107
GROUPE8;APPLI8;HOSTNAME8;STATUS4;LEVEL4; Alerte de type 8;20080108
GROUPE7;APPLI4;HOSTNAME3;STATUS9;LEVEL4; Alerte de type 9;20080109
GROUPE8;APPLI8;HOSTNAME8;STATUS4;LEVEL5; Alerte de type 8;20080108
GROUPE7;APPLI4;HOSTNAME3;STATUS9;LEVEL4; Alerte de type 9;20080109
GROUPE6;APPLI4;HOSTNAME9;STATUS7;LEVEL4; Alerte de type 8;20080110
GROUPE8;APPLI8;HOSTNAME8;STATUS4;LEVEL4; Alerte de type 7;20080118
GROUPE7;APPLI4;HOSTNAME3;STATUS9;LEVEL4; Alerte de type 7;20080119
Résultat à fournir :
=============================
Ecrire un script appelé script3.sh qui, sans réaliser de fichier temporaire ou intermédiaire, va permettre de donner sur la sortie standard (écran = stdout) le résultat suivant (sans les guillemets). Seules les indications entourées de guillemets sont dynamiques :
”
Pour le mois "01"/"2008", il y a eu "13" alertes.
Les 3 alertes les plus fréquentes sont :
"
5 Alerte de type 7
4 Alerte de type 8
2 Alerte de type 9
"
Le niveau d'alerte le plus fréquent ce mois est : "LEVEL4" .
”
Indications :
=========================
Les commandes qui peuvent être utilisées sont (il n’est pas nécessaire de toutes les utiliser, utilisez bien les pages de manuel pour vous aider) : cat, expr, cut, awk, wc, uniq, sort, tail, head, echo, print)
L’ opérateur à employer est | (toujours paillepe :) ).
Questions à se poser :
======================
1. Il faut toujours écrire ce que l’on sait déjà faire avant de chercher les choses que l’on ne sait pas faire (exemple : on sait compter les lignes, alors écrire la commande dans le script).
2. L’indication des commandes est ici une facilité ainsi que le fait que le fichier à traiter soit traitable à la main (c’est différent quand il y a 50 000 enregistrements). Normalement, on doit se dire ” Pour obtenir le nombre d’alertes je dois lire le fichier et compter les lignes, dois-je m’inquiéter des lignes vides ? Si j’essaie la commande est-ce que j’obtiens le bon résultat ? Comment obtenir tel champ, d’ailleurs à quoi correspond-il ? Est-ce que je suis sûr/sûre que cela me renvoie à tous les coups le bon résultat ? Est-ce qu’il existe une commande qui va compter mes enregistrements ? Est-ce qu’il existe une option à la commande que j’utilise qui va me permettre de compter mes enregistrements ? Puisqu’on ne peut pas écrire $MOIS/$ANNEE , comment concatène-t-on les valeurs de variables ? ”
Au bout de quelques temps les questions ci-dessus deviennent des automatismes absolument inconscients : c’est la connaissance et l’expérience.
Au départ, il faut apprendre les commandes : “cut sert à cela, tail sert à cela” et bien lire les manuels. Il est rare de connaître toutes les options d’une commande, mais il faut savoir à quoi servent les commandes. Il existe des systèmes sur lesquels les pages de manuels ne sont pas installées (si,si) et où l’accès au réseau extérieur n’est pas autorisé (si,si). Il est alors bien utile de connaître quelques commandes avec leurs options les plus fréquentes.
N’hésitez pas à poser vos questions en commentaire.
5 commentaires pour Scripts shell - exercice 3 - trier les informations dans un fichier, récupérer ce qui est pertinent et présenter les résultats
Commenter
Trackbacks
Pour faire un trackback sur cet article : http://grepgrrl.org/2008/05/05/shell-3/trackback/


En passant les donnees a la moulinette, j’obtiens bien la suite :
5 Alerte de type 7
4 Alerte de type 8
2 Alerte de type 9
Par contre, ce sont des chaines affichees l’une apres l’autre. Comment faire pour les faire aller a la ligne ?
hello rike
il me semble que tu dois mettre la suite de réponses sur les occurences des alertes dans une variable et faire echo $mavariable . Or, dans une variable les réponses d’une commande sont données séparées par des espaces.
Pour conserver la présentation d’une commande il ne faut pas la mettre dans une variable, mais dans l’enchaînement du script.
Pour mieux comprendre : essaie en console de faire :
cut -d”:” -f3 /etc/passwd
-> un résultat est renvoyé par ligne, puis tu écris :
VARIABLE=`cut -d”:” -f3 /etc/passwd`
echo $VARIABLE
-> :)
merci de ton intérêt !
bonne continuation
bien ces petits exo, merci, ça fait travailler l’imagination. . . surtout ça fait découvrir des petits programmes et des techniques. .. . jusqu’ici tout va bien sauf que j’ai presque bloqué sur le fait de trier les dates de sorte a exclure une évenutelle 02/2009 . . . : ]
sinon, j’ai plutot 14 alertes : ]
n4mu :
pour le nombre d’alerte : avant d’utiliser la commande uniq (-c si on souhaite compter les informations identiques) il faut trier les informations (sort).
merci de ton intérêt pour les scripts !
Correction sur : http://www.google.com/notebook/public/12617965857882522712/BDSIKQgoQ7vHfwJsj
#!/bin/sh
#
# @(#) Extraire et compter des informations
# @(#) Utilisateur : utilisateur normal
# @(#) Usage : sh script.sh
# liste des variables (si utilisées)
MONFICHIER=donnees3.csv
#on compte dans la première colonne le nombre d’entrées
NBALERT=`cut -d”;” -f1 $MONFICHIER | wc -l`
# on lit le fichier, on récupère dans la colonne 7, la dernière ligne (tail -1) (head -1 récupère la première ligne) c’est-à-dire on ne récupère qu’une seule date format YYYYMMJJ
DATEF=`cat $MONFICHIER | cut -d”;” -f7| tail -1`
# on sait que les 4 premiers caracteres sont l’annee et les caracteres 5 et 6 sont le mois
# il existe d’autres façons de faire :) évidemment. Mais ici le format de la date c’est standard :)
ANNEE=`expr “$DATEF” : “\(….\).*”`
MOIS=`expr “$DATEF” : “….\(..\).*”`
# niveau d’alerte le plus frequent :
# on récupère la colonne 5, on trie alphabétiquement cela groupe les chaines identiques
# via uniq -c on compte les chaines identiques puis on tri (décroissant) et on récupère la dernière ligne (tail -1)
# enfin on récupère dans cette dernière ligne, la 8eme colonne (séparateur espace)
LEVELF=`cut -d”;” -f5 $MONFICHIER | sort -n | uniq -c | sort -n | tail -1 | cut -d” ” -f8`
# ou bien
#LEVELF=`cut -d”;” -f5 $MONFICHIER | sort -n | uniq -c | sort -rn | head -1 | cut -d” ” -f8`
echo “Pour le mois ${MOIS}/${ANNEE} il y a eu $NBALERT alertes.”
echo “Les 3 alertes les plus fréquentes sont : ”
# on récupère la colonne 6 du fichier (séparateur ;), on tri alphabétiquement cela groupe les chaines identiques,
# puis on compte les chaines identiques, et on trie de nouveau (sens décroissant), enfin on affiche seulement les 3 premiers résultats
cut -d”;” -f6 donnees3.csv | sort -n | uniq -c | sort -rn | head -3
echo “Le niveau d’alerte le plus fréquent ce mois est : $LEVELF” .
#fin
exit