Scripts shell - exercice 1 - Récupérer une information dans un fichier et la présenter

Titre : Récupérer une information dans un fichier et la présenter.

Matériel :
1. Voici le fichier à traiter (créez un fichier appeler donnees1.csv sur votre machine) :
GROUPE1;APPLI1;HOSTNAME1;STATUS1;LEVEL1; Alerte de type 1;20080101
GROUPE2;APPLI2;HOSTNAME2;STATUS2;LEVEL2; Alerte de type 2;20080102
GROUPE3;APPLI3;HOSTNAME3;STATUS3;LEVEL3; Alerte de type 3;20080103
GROUPE4;APPLI4;HOSTNAME4;STATUS4;LEVEL4; Alerte de type 4;20080104
GROUPE5;APPLI5;HOSTNAME5;STATUS5;LEVEL5; Alerte de type 5;20080105
GROUPE6;APPLI61;HOSTNAME61;STATUS61;LEVEL61; Alerte de type 61;20080106

Résultat à fournir :
Ecrire un script appelé script1.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 :
Parmi les machines ayant eu des alertes ce mois on trouve les machines suivantes :
HOSTNAME1
HOSTNAME2
HOSTNAME3
HOSTNAME4
HOSTNAME5
HOSTNAME61

Indications :
Commandes pouvant être utilisées : cut (de préférence), echo ou print, cat (pour lire le fichier)

Questions à se poser :
Il existe plusieurs façons de construire un script, celle que je vous propose est la suivante :
1. écrivez l’en-tête du script (voir le post précédent) et indiquez par des commentaires où vous placerez les variables et où vous placerez les commandes. Dans certains scripts vous devrez placer des variables au cours de votre script, le résultat pouvant changer entre le début et la fin d’un script, le calcul de la taille d’un répertoire par exemple)
2. “Sur la sortie standard (écran)” : cela signifie que vous lancez la commande d’exécution et vous devez en retour lire le résultat du script à l’écran.
3. Il faut ensuite rédiger le script : ici il faut se dire “sur une ligne j’écris la phrase d’annonce, ensuite je donne la liste des hostnames. La phrase ne contient aucun élément variable, donc j’utiliserai la commande …. . A quoi correspond la liste des hostnames ? Est-ce que c’est une ligne, est-ce que c’est une colonne ?”
4. On teste les commandes qui ne modifient pas le fichier de données, dans un terminal avant de les inclure dans le script.
5. Si on lance un script en console pour débugger et savoir exactement les commandes passées par le script on lance le script de la manière suivante :
$ sh -x script1.sh (si on a bash comme shell, et débuté le script par #!/bin/sh , il existe aussi parfois des liens /bin/bash sur /bin/sh et .bin/sh peut aussi être lié sur un autre type de shell. De base sous GNU/Linux en général on dispose de bash)
$ ksh -x script1.ksh (si on a ksh comme shell, et débuté le script par #!/bin/ksh , c’est fréquent sous solaris, aix …)

Tagged with:

7 commentaires pour Scripts shell - exercice 1 - Récupérer une information dans un fichier et la présenter

  1. #!/bin/sh
    #
    # @(#) Extrait une colonne d'un fichier
    # @(#) Utilisateur : utilisateur normal
    # @(#) Usage : sh script.sh
    #
    # liste des variables (si utilisées)
    # ici le fichier donnees1.csv est dans le meme repertoire que le script1.
    MONFICHIER=donnees1.csv
    # les commandes
    # on ecrit en utilisant echo ou print
    echo "Parmi les machines ayant eu des alertes ce mois on trouve les machines suivantes :"
    # en lisant les premières lignes on se rend compte que le hostname des machines est la 3ème information donnée sur chaque ligne
    # on "découpe" virtuellement le fichier en utilisant le ";" (pensez à toujours utiliser des guillemets autour du délimiteur de champs -d" "
    # ensuite on récupère la colonne 3 du fichier donnees1.csv
    cut -d";" -f3 $MONFICHIER
    # fin
    # la commande s'arrete toute seule après avoir affiché son résultat
    # on peut tout de même terminer le script par
    exit

  2. la présentation des commentaires est peu adaptée aux scripts.

    Tout ce qui est en fraçais est un commentaire ! faites attention en recopiant la solution. Je trouverai un autre moyen de vous communiquer la solution la prochaine fois.

    merci !
    aurélie

  3. Comment faire apparaitre les lignes de commentaires commençant par # @(#)?

    Il me semble qu’il existe une commande qui permette de le faire:
    [commande] script.sh

    permettrait d’afficher :
    Extrait une colonne d’un fichier
    Utilisateur : utilisateur normal
    Usage : sh script.sh

    Merci.

  4. hello tamtam

    écoute, je ne connais pas de commande toute faite permettant de faire cela.

    en général moi j’ajoute une fonction appelée usage qui permet que lorsqu’on lance le script avec un point d’interrogation après le nom du script cela affiche les lignes commençant par les signes particuliers que j’ai choisis ici “# @(#)”. Je fais donc commencer mes lignes spécifiant l’usage (utilisation / aide / indication) par ces signes .

    tamtam@computer:$ sh script1.sh ?

    Je te mets l’exemple du code ici à ajouter au script1.sh par exemple :
    #!/bin/sh
    #
    # @(#) Extrait une colonne d’un fichier
    # @(#) Utilisateur : utilisateur normal
    # @(#) Usage : sh script.sh

    usage () { sed -e ‘/^# @(#)/!d’ -e ’s/^# @(#)//’ $0
    exit ${1:-1}
    }

    case $1 in
    ?) usage;;
    esac

    le résultat :
    $ sh script1.sh ?
    Extrait une colonne d’un fichier
    Utilisateur : utilisateur normal
    Usage : sh script.sh

    si quelqu’un connait une commande toute faite évidemment cela m’intéresse :)

    Aurélie

  5. Vous l’aurez noté vous-même, cette question et son explication sont en dehors du niveau de débutantes et débutants des exercices actuels et je ne les expliquerais pas avant 8 exercices encore (environ).

    Je vous ai indiqué de commencer vos scripts ainsi pour prendre de bonnes habitudes.

    Merci
    Aurélie

  6. tamtam : j’en ai parlé à des amis qui ont dit que j’étais sûrement la seule à faire un truc aussi geek (quelqu’un a dit “autant dans l’esprit unix”, j’étais fière comme un paon… :) )
    certains font bien le case avec le ? ou un help mais au lieu du sed dans la fonction usage ils utilisent un echo :
    usage () { echo ” explications du script”
    exit ${1:-1}
    }
    ma méthode évite d’écrire plusieurs fois les commentaires
    sed sera vu dans un prochain exercice
    aurélie

  7. Enfin un peu de temps pour m’essayer !

    Le man de cut manque d’exemples.. Mais j’en ai trouve ailleurs.
    Mon script :

    #!/bin/sh
    # vars
    FILE=donnees1.csv
    # commands
    echo “Parmi les machines ayant eu des alertes ce mois-ci on trouve :”
    cut -d”;” -f3 $FILE

    Au depart, j’avais ecrit $FILE en minuscules, et ca ne fonctionnait pas. Les variables doivent-elles toujours etre en majuscules (outre la ou on les declare) ?

    Je n’avais pas pense au “exit”.

Commenter

Trackbacks

Pour faire un trackback sur cet article : http://grepgrrl.org/2008/04/23/scripts-shell-exercice-1/trackback/