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

Trouver un mot dans plusieurs fichiers [RESOLU] [Batch] - Shell/Batch - Programmation

Marsh Posté le 08-07-2009 à 10:52:14    

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
Reply

Marsh Posté le 08-07-2009 à 10:52:14   

Reply

Marsh Posté le 08-07-2009 à 10:58:41    

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


Message édité par pataluc le 08-07-2009 à 10:58:57
Reply

Marsh Posté le 08-07-2009 à 11:34:57    

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 ?  

Reply

Marsh Posté le 08-07-2009 à 11:46:21    

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

Reply

Marsh Posté le 08-07-2009 à 12:40:33    

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 ?  
 
 
 

Reply

Marsh Posté le 08-07-2009 à 13:04:11    

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...

Reply

Marsh Posté le 08-07-2009 à 13:23:32    

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 ?  

Reply

Marsh Posté le 08-07-2009 à 14:01:47    

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...

Reply

Marsh Posté le 08-07-2009 à 14:19:53    

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
Reply

Marsh Posté le 08-07-2009 à 14:23:49    

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.

Reply

Marsh Posté le 08-07-2009 à 14:23:49   

Reply

Marsh Posté le 08-07-2009 à 14:31:50    

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:

Reply

Marsh Posté le 08-07-2009 à 14:40:04    

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.

Reply

Marsh Posté le 08-07-2009 à 14:48:15    

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 ?

Reply

Marsh Posté le 08-07-2009 à 15:34:47    

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

Reply

Marsh Posté le 08-07-2009 à 15:38:36    

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

Reply

Marsh Posté le 08-07-2009 à 15:51:15    

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%)

Reply

Marsh Posté le 08-07-2009 à 15:55:20    

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 ?

Reply

Marsh Posté le 09-07-2009 à 07:24:52    

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é

Reply

Marsh Posté le 09-07-2009 à 10:24:24    

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...

Reply

Marsh Posté le 09-07-2009 à 15:18:09    

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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed