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 :

manip de chaines


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut manip de chaines
    voila je suis sous unix et je dois recuperer et analyser un log win32.

    voila la chaine de caractere !!!

    Jul 6 15:26:34 192.168.1.2 security[success] 560 FR-sdsd\toto Objet ouvert Serveur de l'objet : Security Type de l'objet : File
    Nom de l'objet : E:\Datj\Rram\Derls\2054 2eme semestre\Ezedt AM\Documents de l'az\Efddf - SDG.xls Identificateur du handle : 7612 Identificat
    eur de l'op\xe9ration : {0,138714905} Id. du processus : 4 Nom du fichier image : Utilisateur principal : Tgfg$ Domaine principal : FR-Bdfgfgfdg Id d'ouv. de session principale : (0x0,0x3E7) Utilisateur du client : cdfgm Domaine du client : FR-BFfdgg Id. d'ouv. de session client :
    (0x0,0x31CEB9) Acc\xe8s : %%1538 %%4416 %%4419 %%4423 Privil\xe8ges : - Nombre de SID restreint : 0 Masque d'acc\xe8s :0x20089

    Je veux recupérer le champ "Nom de l'objet :" , j'ai donc fait une manip de bricoleur pour isoler ce path, (d'ailleur si quelqu'un a un super idee pour ca ....).
    Sinon le probleme c'est que perl prend les "\" comme des caractères d'echappement, il faudrait les doubler pour qu'ils ne soient pas interprétés.

    merci de m'aider

  2. #2
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 893
    Par défaut
    Salut

    Je ne saurais trop te recommander, si ce n'est déjà fait, de lire les règles du forum.
    Entre autre, tu nous montres le log à parser mais pas ton code que tu as utilisé ! Montres-nous ton code, on verra comment l'optimiser. Sinon, simplement, les regexps sont incontournables. Je ne saurais trop te recommander de voir notre avec notre partie sur les regexps.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut
    bon ... je veux bien montrer mon code mais il ne fonctionne pas du tout ...

    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
     
    $chaine = "Jul 6 15:26:34 192.168.1.2 security[success] 560 FR-sdsd\toto Objet ouvert Serveur de l'objet : Security Type de l'objet : File
    Nom de l'objet : E:\Datj\Rram\Derls\2054 2eme semestre\Ezedt AM\Documents de l'az\Efddf - SDG.xls Identificateur du handle : 7612 Identificat
    eur de l'op\xe9ration : {0,138714905} Id. du processus : 4 Nom du fichier image : Utilisateur principal : Tdfg$ Domaine principal : FR-BFfgdg Id d'ouv. de session principale : (0x0,0x3E7) Utilisateur du client : cdfga Domaine du client : FR-BfgherE Id. d'ouv. de session client :
    (0x0,0x31CEB9) Acc\xe8s : %%1538 %%4416 %%4419 %%4423 Privil\xe8ges : - Nombre de SID restreint : 0 Masque d'acc\xe8s :0x20089"
     
    $x = index ($chaine,"Nom de l'objet");
    print "Valeur dex : $x\n";
    $y = index ($chaine,"Identificateur du handle");
    print "Valeur dey : $y\n";
     
    $result = substr($chaine,$x+17,$y-($x+17));
     
    $result=~ s/\\(.)/$1/g; 
    print "Valeur : $result\n";
    voila

  4. #4
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut
    bon en fait je faisais déja une erreur dès le départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $x = index ($chaine,"Nom de l'objet");
    print "Valeur dex : $x\n";
    $y = index ($chaine,"Identificateur du handle");
    print "Valeur dey : $y\n";
     
    $chaine= s/\\/\\\/g;
     
    $result = substr($chaine,$x+17,$y-($x+17));
     
    print "Valeur : $result\n";
    ca doit etre mieux mais ca marche toujours pas ...
    Comment je peut doubler se maudit caractère "\" ?
    ca doit pas etre trop impossible tout de meme ?

  5. #5
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut
    en fait mon probleme c'est que dès que je stock cette chaine dans une variable, les caractères d'echappements sont interprétés.

    Comment ne pas les interpreter ? comment doubler les '\' ?
    Unrecognized escape \D passed through at test.pl line 3.
    Unrecognized escape \D passed through at test.pl line 3.
    Unmatched ) in regex; marked by <-- HERE in m/\(.) <-- HERE / at test.pl line 5.
    je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $chaine=~ s/\(.)/toto/g;
    print $chaine;
    pour par exemple remplacer les '\' par "toto" mais perl ne trouve plus les '\' parce qu'ils sont deja interprétés .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Unrecognized escape \D passed through at test.pl line 3.
    Unrecognized escape \D passed through at test.pl line 3.
    Unmatched ) in regex; marked by <-- HERE in m/\(.) <-- HERE / at test.pl line 5.

  6. #6
    Membre expérimenté Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Par défaut
    Place ta chaîne entre apostrophes (pas d'interprétation), et non entre guillemets.

  7. #7
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut
    J'avais déja pensé aux apostrophe mais, sachant qu'il y a des apostrophes dans la chaine de log, ca ne passe 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
     
    Bareword found where operator expected at test.pl line 3, near "'Jul  6 15:26:34 192.168.1.12 security[success] 560 FR-BFINANCE\cavram  Objet ouvert     Serveur de l'objet"
            (Missing operator before objet?)
    Unquoted string "objet" may clash with future reserved word at test.pl line 3.
    Backslash found where operator expected at test.pl line 3, near "Dai\"
    Backslash found where operator expected at test.pl line 3, near "Rmam\"
    Backslash found where operator expected at test.pl line 3, near "Dedfs\"
    Number found where operator expected at test.pl line 3, near "2005 2"
            (Missing operator before  2?)
    Bareword found where operator expected at test.pl line 3, near "2eme"
            (Missing operator before eme?)
    Backslash found where operator expected at test.pl line 3, near "l'AdeO\"
    Bareword found where operator expected at test.pl line 3, near "7612    Identificateur"
            (Missing operator before Identificateur?)
    syntax error at test.pl line 3, near "'Jul  6 15:26:34 192.168.1.2 security[success] 560 FR-sdffds\cdfam  Objet ouvert     Serveur de l'objet "
    Unrecognized character \xE9 at test.pl line 3.

  8. #8
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut
    mon probleme, c'est que quand j'utilise des guillements pour delimiter ma chaine, perl interprete tous les "\" comme caractères d'echap.

    Si j'utilise des apostrophes, c ok pour les caracteres d'echap mais ma chaine contenant des apostrophes ... ca plante tout !

    alors là je sais plus quoi faire, je suis perdu, help me please ...

  9. #9
    Membre expérimenté Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Par défaut
    Ben échappe les apostrophes dans la chaîne avec des '\'

  10. #10
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut
    ok, j'aimerais bien echapper les apostrophe et plus de prob ... mais là mon log je le recois tel quel et je ne peut pas traiter la chaine ( \' par exemple) si elle est entre apostrophe vu que ma chaine contient des apostrophes. Perl interprete donc les apostrophes à l'interieur de ma chaine comme des apostrophes de fin de chaines. Il refuse donc le traitement vu qu'il ne trouve pas d'apostrophe ...
    je sais c pas tres clair mais je fais de mon mieux

    sorry

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    pour echapper les metacaracteres tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $chaine = quotemeta($chaine);

  12. #12
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Non, quotemeta n'est pas fait pour cela (il échappe les caractères spéciaux pour les regexs).
    Par contre je ne comprend pas ton problème : tu dis que tu reçois ton log. Donc il ne s'agit pas d'une variable littérale de ton script : lorsque tu le lis, tu n'a pas à t'inquiéter de problème d'interprétation !!!
    Montre nous plutôt comment tu récupères le contenu de ton log.

    --
    Jedaï

Discussions similaires

  1. manip chaine VBS
    Par debutVBA dans le forum VBScript
    Réponses: 15
    Dernier message: 19/01/2012, 16h02
  2. manip chaine caractères (débutant)
    Par comboDev dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 04/11/2008, 12h25
  3. question sur manip chaines :
    Par comboDev dans le forum Unix
    Réponses: 2
    Dernier message: 01/10/2008, 18h15
  4. manip de chaines de caracteres
    Par lolothom dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/04/2008, 10h10
  5. manip de chaine
    Par programmer_c'est_dur dans le forum Access
    Réponses: 7
    Dernier message: 17/01/2007, 14h58

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