IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Supprimer lignes d'un texte avant une expression


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 137
    Par défaut Supprimer lignes d'un texte avant une expression
    Hello,

    Je suis en train de créer un fichier log avec des infos venant de plusieurs serveurs.
    Mon fichier a à peu près cette tête :
    LOG DU 01/01/2009 ET DU 02/01/2009
    serv1 01/01/2009 infos1
    serv1 02/01/2009 infos2
    serv2 01/01/2009 infos1
    serv2 02/01/2009 infos2
    LOG DU 03/01/2009 ET DU 04/01/2009
    serv1 03/01/2009 infos1
    serv1 04/01/2009 infos2
    serv2 03/01/2009 infos1
    serv2 04/01/2009 infos2
    ETC...
    Je ne souhaite garder qu'un mois d'archivage.
    Donc, je voudrais supprimer toutes les lignes situées avant l'expression LOG DU Date à M-1.

    Trouver la date ne me pose pas de problème (je passe par les jours juliens), mais comment supprimer toutes les lignes avant ???

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    @echo off
    if "%1"=="" goto :help
    if "%2"=="" goto :help
    if "%3"=="" goto :help
    
    REM Parcours de la liste de recherche : la date.
    REM On ne cherche, en plus, que les lignes contenant le mot "LOG".
    for /f "tokens=1* delims=: " %%I in ('findstr /n "%1" %2 ^| findstr "LOG"') do (
    	REM %%I contient le numéro de ligne.
    	REM %%J contient la ligne correspondante dans le fichier de log.
    	echo Will extract from line %%I : %%J
    	echo Destination file : %3
    	REM On calcule les arguments de découpe : un délimiteur "inconnu" pour récupérer uniquement toute la ligne.
    	REM On en profite pour sauter les lignes du début jusqu'à celle trouvée au for précédent.
    	REM La ligne de début de log ne doit donc pas contenir un caractère "#" !!!
    	set ARGS="tokens=1* skip=%%I delims=#"
    	REM On recrée la 1ère ligne, car le "skip" précédent va la couper. On initialise en plus le fichier destination.
    	echo %%J > %3
    	REM On vide le reste du fichier d'origine dans le fichier destination, par concaténation.
    	for /f %ARGS% %%E in (%2) do (
    		echo %%E >> %3
    	)
    	echo   Done.
    	REM On ne tient pas compte d'éventuelles lignes "LOG" supplémentaires.
    	goto :eof
    )
    REM Fini, le fichier destination est créé, et amputé de la partie précédant la date recherchée.
    goto :eof
    
    :help
    echo Usage : %0 ^<JJ/MM/AAAA^> ^<LogFile^> ^<DestinationFile^>
    goto :eof
    Il va sans dire que si tu as mieux que la date pour trouver la ligne de découpe, ça marche aussi...
    Tu peux aussi alléger le batch si tu connais déjà le numéro de la ligne, économiser le 3ème paramètre si tu veux de toutes façons remplacer le log d'origine, etc.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Salut,

    j'ai pas tester mais à première vue, le code de Mac LAK aurra des problèmes si le fichier log était un peu conséquent @voir en tout cas..

    voici une autre solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set ".date.=LOG DU 01/01/2009"
    for /f "delims=:" %%a in ('findstr /nc:"%.date.%" log.txt') do (set /a cal=%%a-1)
    more +%cal% log.txt
    ** Bonne Continuation **

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    j'ai pas tester mais à première vue, le code de Mac LAK aurra des problèmes si le fichier log était un peu conséquent @voir en tout cas..
    Dans les deux cas, il y a parcours potentiel du fichier de log deux fois : la première pour trouver la ligne, la seconde pour couper ce qui est avant... A tester, bien sûr, j'ai surtout voulu être didactique et me limiter au strict nécessaire en éléments d'entrée / structures internes du fichier de log.

    Sur une machine pas spécialement performante (disques durs plutôt lents), j'obtiens 2 minutes d'exécution pour un log de 11 Mo, 300.000 lignes, découpe à partir de la ligne 150.000 : c'est pas terrible, mais ça fonctionne automatiquement.

    Par contre, sur un fichier conséquent, ton "more +n" ne fonctionnera pas : il demandera des appuis sur "Espace" de la part de l'utilisateur, y compris avec une redirection vers un fichier... Ce ne sera donc pas automatique.

    Au passage, oubli d'un "goto :eof" après la copie du log (le deuxième "for"), corrigé dans mon post précédent : ceci permet de ne prendre en compte que le PREMIER séparateur de dates, pour éviter des effets de bord pouvant être gênants.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Salut Mac LAK,

    Citation Envoyé par Mac LAK Voir le message
    j'ai surtout voulu être didactique et me limiter au strict nécessaire en éléments d'entrée / structures internes du fichier de log.
    je suis d'accord avec toi sur le point didactiel de ton script.

    Citation Envoyé par Mac LAK Voir le message
    Sur une machine pas spécialement performante (disques durs plutôt lents), j'obtiens 2 minutes d'exécution pour un log de 11 Mo, 300.000 lignes, découpe à partir de la ligne 150.000 : c'est pas terrible, mais ça fonctionne automatiquement.
    c'est que j'ai tester ton script dans mon premier post et j'ai obtenu ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    LOG DU 12/10/2009 ET DU 04/01/2009 
    LOG 
    serv1 
    serv1 
    serv2 
    serv2 
    LOG 
    serv1 
    serv1 
    serv2 
    serv2 
    LOG 
    serv1 
    serv1 
    serv2 
    serv2 
    etc..
    il manque apparemment un %%F dans ta 2e boucle

    aussi, dans ta 1er boucle: 2 filtres donc 2 traitements sur une même ligne. avec un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('findstr /nc:"LOG DU %1" %2')
    on pourra restreindre le temps gourmand que peux prendre le filtrage


    Citation Envoyé par Mac LAK Voir le message
    Par contre, sur un fichier conséquent, ton "more +n" ne fonctionnera pas : il demandera des appuis sur "Espace" de la part de l'utilisateur, y compris avec une redirection vers un fichier... Ce ne sera donc pas automatique.
    mais d'un autre côté c'est souvent plus pratique de visualiser les logs écran par écran..

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    c'est que j'ai tester ton script dans mon premier post et j'ai obtenu ceci:
    ???? Un "%%F" serait toujours vide, vu que je découpe suivant la délimitation "#" uniquement... Je viens de retester chez moi, avec le pseudo-log de l'OP, j'obtiens bien un résultat nickel, SAUF qu'à la première exécution (console "neuve"), ça foire comme ce que tu as indiqué... Au deuxième run (puis tous les autres, quels que soient les fichiers utilisés), ça marche nickel.
    Fatigue....

    Citation Envoyé par I'm_HERE Voir le message
    aussi, dans ta 1er boucle: 2 filtres donc 2 traitements sur une même ligne. avec un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('findstr /nc:"LOG DU %1" %2')
    on pourra restreindre le temps gourmand que peux prendre le filtrage
    Le deuxième filtre ne s'applique qu'au résultat du premier filtre, c'est très light même sur log monstrueux... A peine perceptible, en fait.
    Le but étant surtout d'éviter de devoir connaître / matcher trop précisément la structure de la ligne de séparation de date, c'est pour ça que je ne suis limité au "LOG" exclusivement.

    Citation Envoyé par I'm_HERE Voir le message
    mais d'un autre côté c'est souvent plus pratique de visualiser les logs écran par écran..
    Là, l'OP ne veut pas consulter le log, mais conserver le dernier mois... Donc, le "sauver", ce qui implique une redirection sur un fichier.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/11/2009, 11h04
  2. VBS pour supprimer ligne dans ficher texte
    Par t_predator dans le forum VBScript
    Réponses: 6
    Dernier message: 11/08/2008, 15h20
  3. Réponses: 7
    Dernier message: 20/09/2007, 10h17
  4. Supprimer lignes dans fichier texte
    Par dr_octopus74 dans le forum VBScript
    Réponses: 1
    Dernier message: 20/02/2007, 17h54
  5. Formater un texte dans une expression
    Par stéphane_ais2 dans le forum Access
    Réponses: 5
    Dernier message: 18/10/2005, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo