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

Langage Perl Discussion :

extraire une sous-chaine d'un chaine


Sujet :

Langage Perl

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut extraire une sous-chaine d'un chaine
    Bonjour,

    J'ai un fichier texte qui contient des log.
    Ces log sont ordonnés par bloc avec un pattern de départ et un caractère de fin. Ci dessous un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SEV="CRITICAL":EVTTIME="2011/02/23 04:34:35":FRDNAME="H37":EVTTYPE="EQUIPMENT":PBCAUSE="Ouput Device Error - X733":RSVSTS="NRSV":CLRSTS="CLR":ACKSTS="ACK":ARCHIVETIME="2011/02/23 04:45:05":ARCHIVECAUSE="Ack And Clear":ADDTEXT="$$$ *N=3479/STA/11-02-23/04-34-35/H37         /REPORT NOT AVAILABLE/
        +/H37     /R=01003/HLT1    /
        +/S/D/B A/ES_ESRE/              
     
    ";
    SEV="CRITICAL":EVTTIME="2011/02/23 04:31:22":FRDNAME="H37":EVTTYPE="EQUIPMENT":PBCAUSE="Ouput Device Error - X733":RSVSTS="NRSV":CLRSTS="CLR":ACKSTS="ACK":ARCHIVETIME="2011/02/23 04:45:05":ARCHIVECAUSE="Ack And Clear":ADDTEXT="$$$ *N=3478/STA/11-02-23/04-31-22/H37         /REPORT NOT AVAILABLE/
        +/H37     /R=01003/HLT1    /
        +/S/D/B A/ES_ESRE/              
     
    ";
    j'ai réalisé ce programme qui dans un premier temps extrait le bloc qui commence par le pattern "SEV=" et se termine par un ";"
    ce bloc est donc une chaîne mais qui contient des retours chariot que je souhaite garder.


    ensuite j'ai fait une fonction qui doit extraire ce qui est contenu dans:
    ADDTEXT="..........":

    mais la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($alarme_texte) = $alarme =~ /ADDTEXT=\"(.*)\"/;
    ne fonctionne pas.


    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my $log = $ARGV[0];
     
    # Définition des variables
    my $ligne;               # La ligne courante du fichier en lecture
    my $entree;              # String contenant toutes les infos sur les alarmes
    my $continue = 0;
     
    my $pattern_begin   = "^SEV=";
    my $pattern_fin     = ";\$";
     
    # ouverture du fichier en lecture
    open(FILE, "<$log") or die $!;
     
    # On boucle sur tout le fichier (tant qu'il y a une ligne à lire...)
    while ($ligne = <FILE>)
    {
      # Si la ligne commande par IMSI et que la variable start = 1
      if ( $ligne =~ m/$pattern_begin/ )
      {
          $entree = $ligne;
          $continue = 1;
      }
      elsif ( $continue = 1 && $ligne !~ m/$pattern_fin/ )
      {
          $entree = $entree.$ligne;
      }
      elsif  ( $ligne =~ m/$pattern_fin/ )
      {
          $entree = $entree.$ligne;
          $continue = 0;
          # Affiche le bloc extrait
          print $entree."\n\n";
     
          #affiche juste le texte de l'alarme
          &print_alarme_texte($entree);
      }
    }
     
    sub print_alarme_texte
    {
        my $alarme = $_[0];
        my $alarme_texte = "";
        ($alarme_texte) = $alarme =~ /ADDTEXT=\"(.*)\"/;
        print $alarme_texte."\n\n";
    }

  2. #2
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Points : 322
    Points
    322
    Par défaut
    Le wildcard "." matche tout y compris ".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $alarme =~ /ADDTEXT="([^"]*)"/;
    Il y a une option pour demander à ne pas faire de matching étendu mais je ne l'ai plus en tête...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    effectivement...

    cela fonctionne mieux

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sed extraire une sous-chaine lettre de lecteur
    Par eZula dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 05/03/2008, 07h34
  2. extraire une sous chaine d'un char*
    Par john123 dans le forum C
    Réponses: 7
    Dernier message: 13/10/2007, 00h20
  3. Extraire une sous-chaine
    Par tomy29 dans le forum Delphi
    Réponses: 5
    Dernier message: 25/07/2007, 12h16
  4. Réponses: 6
    Dernier message: 25/06/2007, 11h00
  5. Réponses: 2
    Dernier message: 09/09/2006, 10h40

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