GREP
Bugs
-
lami20j Messages postés 21644 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
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
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
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?
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?
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
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
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
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.
Et l'éxécution
-----------------------------------------------------------------------------------------------------
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]$
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.
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";
}
}
}
Re,
Petite correction (j'ai oublié de mettre un message d'avertisement au cas ou on a pas le droit d'access au fichier).
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";
}
}
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Juste pour le plaisir de faire ça en bash :)
PS: c'est pour le fun juste ;) un bon script perl sera bien plus efficace!
++
#!/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_rechA 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!
++