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

Web Perl Discussion :

Regex w3 Log


Sujet :

Web Perl

  1. #1
    LFC
    LFC est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Février 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 106
    Points : 70
    Points
    70
    Par défaut Regex w3 Log
    Bonjour,

    je me heurte à une regex à écrire en Perl sur une ligne de log de téléchargement de fichier multimédia qui peut avoir ces 2 cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1.2.3.4 - 2018-11-03 00:06:35 GET /filename.mp3 queryparam 206 4870 - "AppleCoreMedia//1.0.0.16A404 (iPhone; U; CPU OS 12_0_1 like Mac OS X; fr_ca)" "1.2.3.4" 0.001 "bytes 0-65534/7254822"
    1.2.3.4 - 2018-11-03 00:06:35 GET /filename.mp3 queryparam 200 4870 "http://lereferer.com" "AppleCoreMedia//1.0.0.16A404 (iPhone; U; CPU OS 12_0_1 like Mac OS X; fr_ca)" "1.2.3.4" 0.001 -
    La 1ère ligne ne contient pas de champs referer et c'est donc un tiret qui est inscrit.
    La 2nde ligne contient un referer mais ne contient pas la dernière valeur "bytes..." et c'est un tiret qui est inscrit.

    Du coup, le Logger écrit un tiret lorsque la valeur est nulle et sinon encadre le champs par un double-guillemet.

    Je me suis aidé du site https://regexr.com/ pour au final avoir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(\S+) (\S+) (\S+) (\S+) (GET|POST) (.*?) (\S+) (\d+) (\d+) (\S+) (".*"|-) (\S+) (\S+) (\s+|-)
    Mais cela ne matche pas cette condition qui dit "si le champs est un tiret ou alors qu'il est entouré par un double-guillemet" et je ne sais pas comment l'écrire.

    Est-ce que vous pourriez m'aider svp ?

    Merci.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour

    Le dernier s est minuscule et cela exprime l'inverse.
    Si tu lui rends sa majuscule, il y a 1 correspondance sur tes 2 soumissions. N'est-ce pas ?

    Attention au caractère gourmand de l'étoile. \S*? correspond probablement plus à ton envie.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je suppose que tu as eu ta réponse avec le post de Flodelarab (++).

    Je voudrais ajouter que cette partie de ta regex:

    est fort dangereuse, car elle risque de reconnaître beaucoup plus que ce que tu ne veux.

    Par exemple, le motif ".*" peut reconnaître l'ensemble de la chaîne "toto" tutu "titi", alors que l'objectif est sans doute de ne reconnaître que "toto".

    Si tu veux capturer un mot ou groupe de mots entre guillemets (sans déborder sur une autre chaîne entre guillemets plus loin), il vaut mieux rechercher un guillemet suivi d'un nombre quelconque de caractères autres que des guillemets, suivi d'un guillemet:

    ou utiliser un quantificateur frugal (non gourmand), c'est-à-dire suivi d'un point d'interrogation, comme +? ou *? :

    Exemple sous le debugger Perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      DB<1> $_ = '"toto" tutu "titi" taratata';
     
      DB<2> print $1 if /(".*")/;      # capture beaucoup trop 
    "toto" tutu "titi"
      DB<3> print $1 if /("[^"]+")/;   # OK (ne capture que "toto")
    "toto"
      DB<4> print $1 if /(".+?")/;     # OK (idem)
    "toto"
      DB<5>

  4. #4
    LFC
    LFC est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Février 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 106
    Points : 70
    Points
    70
    Par défaut
    bonsoir,
    merci pour vos éclaircissements, je garde donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ^(\S+) (\S+) (\S+) (\S+) (GET|POST) (\S*?) (\S+) (\d+) (\d+) (\S+) ("[^"]+") (\S+) (\S+) ("[^"]+"|-)
    qui semble matcher les propositions, je reviens vers vous rapidement pour clôturer le ticket si besoin.

    A+

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(\S+) (\S+) (\S+) (\S+) (GET|POST) (\S*?) (\S+) (\d+) (\d+) (\S+) ("[^"]+") (\S+) (\S+) ("[^"]+"|-)
    me semble pas mal, mais rien n'empêche un nom de fichier de contenir des espaces. D'autre part je pousserais le zèle jusqu'à ajouter une ancre de fin de chaîne.
    D'une manière générale, se méfier des quantificateurs non-gourmands qui donne un fausse impression de contrôle.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    rien n'empêche un nom de fichier de contenir des espaces.
    Rien ne l'empêche, effectivement, mais il vaut beaucoup mieux éviter dans la mesure du possible, car c'est la source de toutes sortes de difficultés et même de problèmes. Ne serait-ce que le fait qu'il faut utiliser des quotes pour manipuler ces fichiers et qu'on ne voit pas ces espaces quand ils sont à la fin du nom de fichier ou de répertoire.

    Dernier exemple rencontré en date: lors d'une récente mise à jour de SVN (Apache Subversion), les noms des répertoires de notre dépôt SVN contenant des espaces empêchaient toute mise à jour du contenu de ces répertoires (commits, création de tags et de branches impossibles). Nous avons dû renommer manuellement tous ces répertoires pour remplacer les espaces par des traits de soulignement (underscores).

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Mais nous vivons dans un monde dangereux, de même qu'il y a des maniaques de l'heure exacte, il y a des pervers de l'espace dans les noms de répertoires.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    LFC
    LFC est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Février 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 106
    Points : 70
    Points
    70
    Par défaut
    bonjour,

    merci à tous pour vos conseils, ce sujet peut être fermé.

    A+

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

Discussions similaires

  1. [RegExp] Regex pour extraire un tableau sérialisé d'un fichier log IPN-Paypal
    Par devEric69 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/11/2016, 19h33
  2. Regex pour matcher les log REJECT iptables
    Par Arnaudp33x33 dans le forum Sécurité
    Réponses: 2
    Dernier message: 11/04/2016, 10h45
  3. fail2ban regex pour le fichier de log
    Par mapmip dans le forum Sécurité
    Réponses: 0
    Dernier message: 24/08/2013, 22h05
  4. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24
  5. [] [Stratégie] Comment créer un fichier log
    Par Skeezo dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 16/09/2002, 18h30

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