GREP

Bugs -  
lami20j Messages postés 21644 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

lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
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
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
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
bugs
 
Merci
J'essaie ce log et je te tiens au courant.
Bonne journée
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > 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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
0