Forum Programmation.shell Script qui scrute un fichier logs ?? Besoin d'aide

Posté par  .
Étiquettes : aucune
0
23
mai
2006
Bonjour,

Je vous explique mon problème de script :
On me demande de créer un script sous shell bash qui scrute un fichier logs à la recherche d'erreur. Ce script doit prendre en entrée un fichier de paramètres qui indiquent la log à surveiller et les patterns qu'il faut trouver. A chaque passage du script uniquement les nouvelles entrées doivent être signalées au fichier Alarme.log.

Si quelqu'un pouvait me donner une base de départ de ce script ??
je le modifierai par la suite.

Merci d'avance.
  • # Bien sûr!

    Posté par  (site web personnel, Mastodon) . Évalué à 4.

    Voilà un bon début pour ton script:

    #!/bin/sh

    La gelée de coings est une chose à ne pas avaler de travers.

    • [^] # Re: Bien sûr!

      Posté par  . Évalué à 1.

      je te remercie mais ça je sais le taper !!

      Mon script commencerait par :

      while read fichier_log

      do ...

      Si tu peux un peu plus me renseigner ce serait sympa.
      Merci
  • # logtail

    Posté par  . Évalué à 2.

    Pour la partie "uniquement les nouvelles entrées doivent être signalées" regardes du côté de logtail, ça marche bien ce petit truc.

    http://packages.debian.org/stable/admin/logtail
    • [^] # Re: logtail

      Posté par  . Évalué à 1.

      Tu peux aussi essayer un :

      tail -n 0 -f mon_fichier_qui_va_bien | while read line ; do
      echo $line | truc_qui_recherche_des_patterns ;
      done ;

      Le tail -f sert à afficher les nouvelles lignes.
      Le -n 0 permet de ne pas afficher les 10 dernières lignes

      man tail !
      • [^] # Re: logtail

        Posté par  . Évalué à 2.

        Je remplaceraéi ton

        while read line ; do
        echo $line | truc_qui_recherche_des_patterns ;
        done ;
        :)

        par awk qui est justement fait pour ça !!!!
  • # Script shell

    Posté par  (site web personnel) . Évalué à 3.

    Je te recommande le bash scripting guide : http://www.tldp.org/LDP/abs/html/ c'est indispensable.
    Voici un petit script que j'ai écrit ya pas longtemps, ca peux peut etre te donner une idée de l'utilisation de grep, sed, awk, etc... Exécute le ligne par ligne et tu finira par tout maitriser.

    #!/bin/bash
    # This script was written in order to download Arte-radio RSS flow's file, if
    # they are not in directory, and prefix them with the current date.
    # See that I am changing mp3 -> ogg, and I remove _hq from the fileneme,
    # in order to download ogg vorbis. All the files are not in ogg format.

    # working directory
    cd /home/francois/My_music/autre/arteRadio/

    wget http://www.arteradio.com/makeRSS.do -O makeRSS.do
    cat makeRSS.do | grep title | sed -e 's///' | sed -e 's/<\/title>//'
    cat makeRSS.do | tr -t '"' " " | sed -e 's/mp3/ogg/' | sed -e 's/_hq//' | awk '/enclosure/ {print $3}' > urlList

    echo

    while read url
    do
    filename=`echo $url | tr "/" " " | awk '{print $4}'`
    filename2=`echo \`date --rfc-3339=date\`"__"$filename`
    if [ -e "$filename2" ]
    then
    echo "$filename2 ... présent !"
    else
    wget -c $url -O $filename2
    fi

    done < urlList

    rm urlList makeRSS.do

    Adhérer à l'April, ça vous tente ?

    • [^] # Re: Script shell

      Posté par  . Évalué à 2.

      Quelques remarques sur ton script:

      cat makeRSS.do | grep title | sed -e 's///' | sed -e 's/<\/title>//'

      Beurk !!!! Pas de cat | grep, M*%$+!

      grep title makeRSS.do |grep title |....
      Je comprend pas le pourquoi du sed -e 's///'. De plus il doit être possible d'éviter le sed xxx | sed yyy avec un sed 'xxx yyy' bien senti.

      cat makeRSS.do | tr -t '"' " " | sed -e 's/mp3/ogg/' | sed -e 's/_hq//' | awk '/enclosure/ {print $3}' > urlList

      Même remarque pour le cat.

      Sinon un truc comme ça devrait faire l'affaire:

      awk '/enclosure/ {
      sub(/mp3/,"ogg",$3)
      sub(/_hq/,"",$3)
      print $3
      }' makeRSS.do > urlList

      Je suppose que le remplacement de chaine se fait sur $3


      Ensuite:

      filename=`echo $url | tr "/" " " | awk '{print $4}'

      filename=`echo $url | awk '{
      sub("/"," ",$4);print $4}'

      Je suis de plus convaincu que ta boucle "while " pourrait être remplacé par un awk. J'irais plus loin en disant que ce que tu fais dans ta boucle while pourrait être intégré dans la boucle générant le fichier urlList.

      J'ai des idées mais pas le temps pour le moment de tout écrire. A la limite si ca t'intéresse de voir ce que ça fait en awk, essaie de me fournir un bout de fichier d'entrée que je puisse tester plus tard ...
      • [^] # Re: Script shell

        Posté par  (site web personnel) . Évalué à 2.

        Ouais, awk il faudra que j'apprenne a m'en servir un jour. Je ne suis pas informaticien, et je scripte rarement, alors c'est sur que je dois faire des trucs un peu bas de gamme.

        Adhérer à l'April, ça vous tente ?

  • # juste pour info ....

    Posté par  . Évalué à 2.

    Ce script doit prendre en entrée un fichier de paramètres qui indiquent la log à surveiller et les patterns qu'il faut trouver.

    Te rend-tu compte que tu décris précisément le fonctionnement de la commande Awk?

    extrait de la page man de awk sous aix:



    awk Command

    Purpose
    Finds lines in files that match patterns and then performs specified actions on them.
    (...)

    Description
    The awk command utilizes a set of user-supplied instructions to compare a set of files, one line at a time, to extended regular expressions supplied by the user. Then actions are performed upon any line that matches the extended regular expressions.
    (...)

    Flags
    -f ProgramFile Obtains instructions for the awk command from the file specified by the ProgramFile variable. If the -f flag is specified multiple times, the concatenation of the files, in the order specified, will be used as the set of instructions.



    A chaque passage du script uniquement les nouvelles entrées doivent être signalées au fichier Alarme.log.
    Avec Awk, tu peux compter le nombrer d'enregistrement (autrement dit de lignes) contenu dans un fichier. Donc a chaque passage, tu peux écrire quelque part le nombre de lignes lues. Attention cependant, si le fichier de log en question vient à être "vidé", il faudra que le script le prenne en compte.
  • # et perl?

    Posté par  (site web personnel) . Évalué à 0.

    Ne serait-ce pas plus simple en perl?

    parce que dès qu'on parle de patern, de fichier log, .... j'aurais tendance à dirigé vers perl....
    • [^] # Re: et perl?

      Posté par  . Évalué à 3.

      Plus simple, pas forcément. Ca dépend de la complexité dudit script.
      awk permet de faire pas mal de choses et est suffisant dans beaucoup de cas. Il traite les tableaux (tableaux associatifs, avec simulation de tableaux a plusieurs dimensions). Par contre il n'a pas de système de référencement de variables comme Perl, et il est vrai que c'est parfois gênant (c'est dans ces cas là que je me tourne vers Perl).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.