GREP

Bonsoir,
Malgrè vos très nombreuses réponses, une question reste toujours en suspend, probablement que je m'étais mal exprimé donc je reformule autrement:
Je souhaiterai avec l'aide d'une commande 'grep" récupérer des élements dans un fichiersmais pas m'importe lesquels, ceux qui se trouvents dans une certaine partie du fichier: donc je vous joint le type du ficher volontairement tronqué en vous indiquant ce que je souhaiterai récupérer mais je ne sais pas comment formuler le grep sachant que je ne peut pas me fier aux numéros de ligne, je souhaiterai indiquer au grep l'endroit ou faire sa recherche:

------------- Debut verifMedia -------------mardi 27 septembre 2005, 04:05:01
>>>1) analyse de la planification des sauvegardes
date:27/09/2005
jobId:1446
média:DLT
type:différentielle
mode:overwrite (ecriture en début de média)
le lecteur 'DLT' retenu est le '/dev/rmt/c2b0t6l0' (BNCHMARKDLT1 5538)
------------- Fin verifMedia -------------mardi 27 septembre 2005, 04:05:13

------------- Debut sauve -------------mardi 27 septembre 2005, 04:05:13
date:03/10/05 <----------cette date je voudrais la récupérer
heure:04:05:20
jobId:1612 <-----------ce numéro je voudrais le récupérer
type:différentielle
dernière sauvegarde 'Full':samedi 24 septembre 2005 - 16 h 05
04:35:56 début sauvegarde '/ux'
04:50:49 fin sauvegarde '/ux'
sauvegarde terminée <-------cette mention je voudrais récupérer
------------- Fin sauve -------------mardi 27 septembre 2005, 04:50:49

Merci de bien vouloir encore une fois me dépanner en me donnant une syntaxe pour ce problème
Bonne soirée à tous

6 réponses

  1. Modérateur
    Salut bugs,

    probablement que je m'étais mal exprimé donc je reformule autrement:

    Dans ton fichier tu veux récuperer que 2 champs ou tous les champs date et jobID?
    0
    1. Je ne veux récupérer que les infos mentionnées donc une date un jobId et une ligne qui se situent toujours dans le même paragraphe, mais dont le nombre de lignes ou leur position (en lignes) dans le paragraphe peut changer d'un fichier à l'autre
      0
  2. Salut,
    grep n'est pas fait pour ça,
    Regardes plutôt du coté de awk qui permet de compter des lignes et se base
    sur des expressions régulières
    Des script plus évolué en perl ou python pourrait être même mieux car il
    pourront faire face à des cas de figure inprévus.
    A+, crabs
    0
    1. Modérateur
      Voilà le script traitement_log
      Le script fonctionne dans le sens ou la date est après Debut sauve et jobId est après la date en supposant que le résultat de la sauvegarde est à la fin.

      #! /usr/bin/perl -w
      use strict;
      
      # le fichier à traiter : /home/lamitest/temp/bugs.txt
      open (FIC, "/home/lamitest/temp/bugs.txt");
      $/="";
      while (<FIC>){
       if (m#(?<=Debut sauve).*(\d\d\/\d\d\/\d\d).*jobId:(\d+).*(sauvegarde terminée)#ism){
       print "date = $1\njobId = $2\nrésultat = $3\n";
       }
      }
      

      Et l'éxécution
      -----------------------------------------------------------------------------------------------------
      [lamitest@localhost temp]$ pwd
      /home/lamitest/temp
      [lamitest@localhost temp]$ cat bugs.txt
      ------------- Debut verifMedia -------------mardi 27 septembre 2005, 04:05:01
      >>>1) analyse de la planification des sauvegardes
      date:27/09/2005
      jobId:1446
      média:DLT
      type:différentielle
      mode:overwrite (ecriture en début de média)
      le lecteur 'DLT' retenu est le '/dev/rmt/c2b0t6l0' (BNCHMARKDLT1 5538)
      ------------- Fin verifMedia -------------mardi 27 septembre 2005, 04:05:13
      
      
      ------------- Debut sauve -------------mardi 27 septembre 2005, 04:05:13
      date:03/10/05 <----------cette date je voudrais la récupérer
      heure:04:05:20
      jobId:1612 <-----------ce numéro je voudrais le récupérer
      type:différentielle
      dernière sauvegarde 'Full':samedi 24 septembre 2005 - 16 h 05
      04:35:56 début sauvegarde '/ux'
      04:50:49 fin sauvegarde '/ux'
      sauvegarde terminée <-------cette mention je voudrais récupérer
      ------------- Fin sauve -------------mardi 27 septembre 2005, 04:50:49
      [lamitest@localhost temp]$ perl traitement_log
      date = 03/10/05
      jobId = 1612
      résultat = sauvegarde terminée
      [lamitest@localhost temp]$
      
      0
      1. Modérateur
        Re,

        Encore une version, mais cette fois la position des date, jobId et sauvegarde terminée n'importe. La seule chose que les lignes doivent ce trouvées après Debut sauve.
        #! /usr/bin/perl -w
        use strict;
        
        # le fichier à traiter : /home/lamitest/temp/bugs.txt
        open (FIC, "/home/lamitest/temp/bugs.txt");
        $/="";
        while (<FIC>){
         if (m#(?<=Debut sauve)#ism){
          if (m#(\d\d\/\d\d\/\d\d)#smi){
           print "date = $1\n";
          }
        
          if (m#jobId:(\d+)#smi){
            print "jobId = $1\n";
          }
        
          if (m#(sauvegarde terminée)#smi){
                   print "résultat = $1\n";
          }
         }
        }
        
        0
        1. Merci
          J'essaie ce log et je te tiens au courant.
          Bonne journée
          0
        2. Modérateur
          @bugsRe,

          Petite correction (j'ai oublié de mettre un message d'avertisement au cas ou on a pas le droit d'access au fichier).

          #! /usr/bin/perl -w
          use strict;
          
          # le fichier à traiter : /home/lamitest/temp/bugs.txt
          # à remplacer avec ton arborescence
          open (FIC, "/home/lamitest/temp/bugs.txt") or die "Impossible d'ouvrir le fichier : $!";
          $/="";
          while (<FIC>){
           if (m#(?<=Debut sauve)#ism){
            if (m#(\d\d\/\d\d\/\d\d)#smi){
             print "date = $1\n";
            }
          
            if (m#jobId:(\d+)#smi){
              print "jobId = $1\n";
            }
          
            if (m#(sauvegarde terminée)#smi){
                     print "résultat = $1\n";
            }
           }
          }
          0
      2. Webmaster
        Juste pour le plaisir de faire ça en bash :)
        #!/bin/sh
        ligne_debut_rech=$(grep -n "Debut sauve" fichier |cut -f1 -d:)
        ligne_fin_rech=$(grep -n "Fin sauve" fichier |cut -f1 -d:)
        nb_ligne_pour_rech=$(($ligne_fin_rech - $ligne_debut_rech + 1))
        head -$ligne_fin_rech fichier |tail -$nb_ligne_pour_rech
        A partir de la, tu as tout ce qu'il te faut (tu récupere juste le bout du fichier dans lequel tu souhaite faire une recherche)

        PS: c'est pour le fun juste ;) un bon script perl sera bien plus efficace!

        ++
        0