Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2488 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [RESOLU] [Batch] Trouver un mot dans plusieurs fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] [Batch] Trouver un mot dans plusieurs fichiers

n°1903474
manu776232​3
Posté le 08-07-2009 à 10:52:14  profilanswer
 

Bonjour,  
 
J'ai un répertoire dans lequel sont créés chaque jour plusieurs fichiers de log. J'aimerai écrire un script (lancé depuis un autre répertoire) permettant de dire qu'il y a des erreurs si le mot "erreurs" est trouvé dans l'un ou plusieurs de ces fichiers. D'autre part, j'aimerai qu'il me donne le nom des fichiers dans lesquels il a trouvé "erreurs". Est-ce que c'est possible ?  
 
Merci d'avance pour votre aide !


Message édité par manu7762323 le 09-07-2009 à 15:18:28
mood
Publicité
Posté le 08-07-2009 à 10:52:14  profilanswer
 

n°1903480
pataluc
Posté le 08-07-2009 à 10:58:41  profilanswer
 

cherche du coté de grep: http://www.google.fr/search?q=grep


Message édité par pataluc le 08-07-2009 à 10:58:57
n°1903499
manu776232​3
Posté le 08-07-2009 à 11:34:57  profilanswer
 

Ce script sera exécuté sur un serveur Windows, je pense donc que c'est plutôt du côté de la commande "find" qu'il faut chercher non ?  
 
Pour trouver le mot "erreurs" dans tous les fichiers log, j'ai trouvé ça :  
 

Code :
  1. for %a in (*.txt) do find "erreurs" %a


 
Ca marche à partir du moment où j'exécute la commande à partir du répertoire dans lequel se trouve les fichiers mais je ne sais pas comment faire pour qu'elle s'exécute à partir d'un autre répertoire.  
 
Est-ce que je suis sur la bonne voie ?  

n°1903512
pataluc
Posté le 08-07-2009 à 11:46:21  profilanswer
 

1. Il existe des portages sous Win des commandes unix: http://unxutils.sourceforge.net/
 
2. pas besoin de for:

Code :
  1. find "erreurs" tonlecteur:\tonchemin\..\*.log

n°1903559
manu776232​3
Posté le 08-07-2009 à 12:40:33  profilanswer
 

Merci, ça fonctionne.  :)  
 
Par contre, à la fin de mes fichiers de log, j'ai une ligne qui indique le nombre d'erreurs du fichier, du style

[07/07/2009 21:48:29]: Opération terminée : 0 erreurs

, par exemple. J'aimerai que cette ligne n'apparaisse pas dans ma recherche mais je ne connais pas l'option qu'il faut employer.  
 
 
Ensuite j'ai rajouté le retour d'erreur et le fait de mettre le résultat de la recherche dans fichier :  

Code :
  1. @find "erreurs" c:\backup\*.log > c:\backup\result_errors.txt
  2. @if not exist c:\backup\result_errors.txt goto GREEN
  3. :RED
  4. @echo CRITICAL: Errors are available in c:\backup\result_errors.txt file
  5. @exit 2
  6. :GREEN
  7. @echo OK: No errors
  8. @exit 0
  9. @DEL c:\backup\result_errors.txt


 
Je mets les erreurs dans "c:\backup\result_errors.txt"
Si le rapport d'erreur n'existe pas, c'est qu'il n'y a pas d'erreur donc c'est OK
Sinon c'est CRITIQUE et il donne le chemin du fichier du rapport dans lequel les erreurs ont été mises
A la fin, j'efface le fichier du rapport d'erreur
 
Est-ce que c'est bon comme ça ?  
 
 
 

n°1903568
pataluc
Posté le 08-07-2009 à 13:04:11  profilanswer
 

pour enlever le décompte d'erreurs, derrière ton find tu en mets un second qui les enlève:
 

Code :
  1. @find "erreurs" c:\backup\*.log | find /v "Opération terminée" > c:\backup\result_errors.txt


 
le reste me semble bon, a part que je pense que le del derrière le exit ne va pas donner grand chose...

n°1903574
manu776232​3
Posté le 08-07-2009 à 13:23:32  profilanswer
 

J'ai mis la ligne  

Code :
  1. @find "erreurs" c:\backup\*.log | find /v "Opération terminée" > c:\backup\result_errors.txt

mais ça ne change rien, dans mon fichier j'ai toujours le décompte d'erreurs qui apparaît.
 
Oui effectivement le del derrière le exit ne donne rien du tout... où est-ce que je peux le mettre pour que le fichier se supprime ? Peut-être au tout début ?  

n°1903589
pataluc
Posté le 08-07-2009 à 14:01:47  profilanswer
 

manu7762323 a écrit :

J'ai mis la ligne  

Code :
  1. @find "erreurs" c:\backup\*.log | find /v "Opération terminée" > c:\backup\result_errors.txt

mais ça ne change rien, dans mon fichier j'ai toujours le décompte d'erreurs qui apparaît.


 
étrange... peut être un pb de casse ou d'accents... essaie avec un /i en plus dans le second find, et essaie avec find "ration termin"
 
 

manu7762323 a écrit :

Oui effectivement le del derrière le exit ne donne rien du tout... où est-ce que je peux le mettre pour que le fichier se supprime ? Peut-être au tout début ?  

:sarcastic: ben, juste au dessus du exit...

n°1903601
manu776232​3
Posté le 08-07-2009 à 14:19:53  profilanswer
 

Ah ben non, je suis bête, si je supprime le fichier result_errors.txt à la fin du script on ne pourra pas le consulter pour voir les erreurs ! Il faut que je le mette au début du script plutôt, non ?  
 
Avec le /i ça ne marche toujours pas, par contre avec "ration termin" c'est bon. J'ai essayé "ération termin" avec et sans /i et ça ne fonctionne pas, j'en déduis que c'est le "é" qui pose problème... c'est pas grave je vais laisser "ration termin".  
 
Donc comme ça ça fonctionne, mais par contre dans le fichier "result_errors.txt", je n'ai pas que les lignes des fichiers qui contiennent les erreurs, j'ai aussi une ligne pour chaque nom de fichier dans lequel il a cherché, c'est normal ?  
 
Ca me donne :  
 


---------- C:\BACKUP\SERVEUR1-WSS-A09F01_DOC_EXPORT_D2.EXPORT.LOG
 
---------- C:\BACKUP\SERVEUR1-WSS-A09F01_EXPORT_D2.EXPORT.LOG
 
---------- C:\BACKUP\SERVEUR1-WSS-A09F02_DOC_EXPORT_D2.EXPORT.LOG
[07/07/2009 21:40:27]: erreurs:Exportation du dossier /wss/A09F02_doc/_catalogs/wt.
[07/07/2009 21:40:27]: erreurs:Exportation du dossier /wss/A09F02_doc/_cts/Task.
 
---------- C:\BACKUP\SERVEUR1-WSS-A09F02_EXPORT_D2.EXPORT.LOG


 
En fait j'ai l'impression que ce sont les noms des fichiers dans lesquels il avait trouvé la ligne correspondante à "Opération terminée". C'est possible de ne pas avoir ces noms là et de ne garder que les noms des fichiers dans lesquels il y a les erreurs ?
 
Je sais pas si c'est très clair...


Message édité par manu7762323 le 08-07-2009 à 14:20:49
n°1903606
pataluc
Posté le 08-07-2009 à 14:23:49  profilanswer
 

ben ton fichier tu le supprime si ya pas d'erreur, donc juste avant le exit final. S'il ya des erreur tu n'y touche pas. par contre ca ne sert à rien de le supprimer avant vu que tu vas l'écraser...
 
sinon, je me doutais un peu que tu allais vouloir jarter les lignes des fichiers ou il a compté 0 erreurs... du coup le plus simple c'est sans doute de faire ca:

Code :
  1. @find "erreurs:" c:\backup\*.log > c:\backup\result_errors.txt

en supposant que les lignes en erreur auront toujours la syntaxe que tu as mis dans ton spoiler... ^^  
 
c'est plus simple en un seul find.

mood
Publicité
Posté le 08-07-2009 à 14:23:49  profilanswer
 

n°1903610
manu776232​3
Posté le 08-07-2009 à 14:31:50  profilanswer
 

Oui c'est un peu plus simple comme ça, et effectivement les lignes en erreurs auront toujours la même syntaxe  :)  
 
Par contre même après avoir modifié j'ai toujours tous les noms de fichiers dans mon fichier .txt, comme avant...  Je galère pour un truc tout bête je suis sûr :pfff:

n°1903619
pataluc
Posté le 08-07-2009 à 14:40:04  profilanswer
 

ah ouais c pas impossible que le find les mette tout le temps... ya pas l'air d'avoir d'options pour les jarter. sinon, ya pas de mystère, on revient au grep: http://unxutils.sourceforge.net/ ou la ca marchera.

n°1903626
manu776232​3
Posté le 08-07-2009 à 14:48:15  profilanswer
 

OK, merci en tout cas !  
 
Et donc pour le UnixUtils il faut que je fasse quoi avec ? il faut juste décompresser les fichiers sur le serveur sur lequel je veux l'utiliser ou il y a quelque chose à installer ?

n°1903671
pataluc
Posté le 08-07-2009 à 15:34:47  profilanswer
 

tu ouvre l'archive, et tu récupére le grep.exe

n°1903679
manu776232​3
Posté le 08-07-2009 à 15:38:36  profilanswer
 

ah ben oui, nickel !  
 
et euh je vais être chiant mais dans ce cas là ça donnerait quoi avec l'utilisation du grep ?  :ange:  

n°1903710
pataluc
Posté le 08-07-2009 à 15:51:15  profilanswer
 

tu remplace juste le find par grep ca doit marcher (assure toi juste de mettre le bon chemin pour grep ou de mettre son chemin dans le %PATH%)

n°1903722
manu776232​3
Posté le 08-07-2009 à 15:55:20  profilanswer
 

Super !  :)  
 
Par contre dernière petite chose..avec grep il met tout à la suite dans le fichier result_errors.txt...pas de saut de retour à la ligne ni rien donc c'est assez illisible..y aurait-il une option pour mettre un peu en forme ?

n°1903910
eZula
Posté le 09-07-2009 à 07:24:52  profilanswer
 

C'est vrai que c'est chiant ce problème de retour chariot. Autant dans la fenêtre DOS ça passe, autant si tu rediriges le résultat dans un fichier tu vas te retrouver avec des petits carrés et effectivement ça pose des pbs de lisibilité. Une solution consiste à substituer les fins de ligne unix (engendrés par GREP) par des retours DOS :
 

Citation :

GREP "expression" | SED "s/$/\r/g"


 
ou encore
 

Citation :

SED -i "s/$/\r/g" ton_fichier


 
bien sur cela suppose d'inclure l'utilitaire SED, dis toi que ce n'est pas perdu tu auras un très grand nbre de fonctionnalités supplémentaires avec lui, dans le cadre de traitement de fichiers textes http://gnuwin32.sourceforge.net/packages/sed.htm
 
Mais si quelqu'un a une autre solution, je suis intéressé

n°1903944
manu776232​3
Posté le 09-07-2009 à 10:24:24  profilanswer
 

J'ai trouvé ! Il suffit d'utiliser l'option "-U" dans le grep :
 

-U, --binary
              Traiter  les  fichiers comme s'ils taient des fichiers binaires.
              Par dfaut, sous MS-DOS et MS-Windows, grep dtermine le  type  de
              fichier  en regardant le contenu des 32 premiers kilo-octets. Si
              grep dcide que le fichier est un fichier de texte, il enlve  les
              retours  chariot  (CR)  du contenu du fichier original (afin que
              les expressions avec ^ et $ fonctionnent correctement). L'option
              -U  modifie ce comportement, tous les fichiers sont alors lus et
              traits tels quels. Si le fichier est un fichier  de  texte  avec
              des   paires  CR-LF  en  fin  de  ligne,  certaines  expressions
              rationnelles peuvent chouer. Cette option n'a  aucun  effet  sur
              des plates-formes autres que MS-DOS et MS-Windows.


 
J'ai donc ma commande :

Code :
  1. @grep -U "erreurs:" c:\backup\*.log > c:\backup\result_errors.txt


 
 :)  
 
Dernière petite chose, j'ai maintenant le petit script suivant :  

Code :
  1. @grep -U "erreurs:" c:\backup\*.log > c:\backup\result_errors.txt
  2. @if not exist c:\backup\result_errors.txt goto GREEN
  3. :RED
  4. @echo CRITICAL: Errors are available in c:\backup\result_errors.txt file
  5. @exit 2
  6. :GREEN
  7. @echo OK: No errors
  8. @DEL c:\backup\result_errors.txt
  9. @exit 0


 
Le problème que je rencontre est que admettons que le jour J il y ait des erreurs. J'ai bien mon fichier "result_errors.txt" qui est créé avec les lignes d'erreurs à l'intérieur. Par contre, si le jour J+1 je n'ai pas d'erreur, j'ai remarqué que le fichier existe toujours et qu'il est vide. Le problème c'est qu'il existe et donc que mon script n'ira pas dans ":GREEN".  
 
Je ne sais pas trop comment faire pour qu'il soit supprimé s'il n'y a plus d'erreur...

n°1904106
manu776232​3
Posté le 09-07-2009 à 15:18:09  profilanswer
 

C'est bon, j'ai trouvé !  
 

Code :
  1. grep -U "Erreur:" c:\backup\*.log > c:\backup\result_errors.txt
  2. for /r "c:\backup\" %%i in (result_errors.txt) do if %%~zi==0 goto GREEN
  3. :RED
  4. echo CRITICAL: Errors are available in c:\backup\result_errors.txt file
  5. exit 2
  6. :GREEN
  7. del c:\backup\result_errors.txt
  8. echo OK: No errors
  9. exit 0


 
Merci à tous pour votre aide !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [RESOLU] [Batch] Trouver un mot dans plusieurs fichiers

 

Sujets relatifs
Ecrire une page html en vbs[Résolu][Hibernate] Rollback Exception improbable
[Resolu][C#] Dupliquer un fichier[Résolu][ASP.NET][C#] Heritage et partage de variable
[résolu] Activer la lib GD - IIS - PHP[Résolu]VBA comment optimiser l'utilisation CPU dans un loop?
[Batch] Gzip Fichiers .pdf par paquets[Resolu]Adaptation programme Windows vers Linux
[java] Problème d'optimisation de traitements batch 
Plus de sujets relatifs à : [RESOLU] [Batch] Trouver un mot dans plusieurs fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR