GREP

Bugs -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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. bugs
       
      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. crabs Messages postés 909 Statut Membre 507
     
    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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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. bugs
       
      Merci
      J'essaie ce log et je te tiens au courant.
      Bonne journée
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > bugs
         
        Re,

        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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
     
    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
  7. bugs
     
    Bonsoir,
    Si j'ai tout compris il faut me mettre au "PERL".......
    Merci pour la réponse et le fichier bash
    Bonne continuation
    0