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

Shell et commandes GNU Discussion :

Question sur un GREP


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2019
    Messages : 12
    Par défaut Question sur un GREP
    Bonjour j'ai réalisé un Regex que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^([0-9]{1,3}\.){3}([0-9]){1,3};[0-9]{1,5};([0-9]{1,3}\.){3}([0-9]){1,3};[0-9]{1,5}
    donc celle-ci repère bien une ip par exemple :

    192.168.10.10;12345;192.168.10.12;12345

    Mais lors d'un grep de mon fichier elle ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     grep -x '([0-9]{1,3}\.){3}([0-9]){1,3};[0-9]{1,5};([0-9]{1,3}\.){3}([0-9]){1,3};[0-9]{1,5}'
    Ne retourne rien !

    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     grep -v '([0-9]{1,3}\.){3}([0-9]){1,3};[0-9]{1,5};([0-9]{1,3}\.){3}([0-9]){1,3};[0-9]{1,5}'
    Retourne cela:

    Request;192.168.12.50 #erreur
    192.168.12.27;192.168.12.50 #erreur

    192.168.12.45;443;192.168.12.50;52192
    192.168.12.123;192.168.12.50 #erreur
    192.168.12.68;161;192.168.12.50;47569


    Normalement :
    192.168.12.68;161;192.168.12.50;47569
    192.168.12.45;443;192.168.12.50;52192



    Je vous joins les commandes pour gagner du temps lors de vos tests : #je sais que les deux awk c'est pas beau je recherche à les rassembler.

    tcpdump -nn src net votrereseau/24 and dst ipdestination -c 1000 | awk 'BEGIN{OFS=";"}{sub(":$","",$5);print $3,$5}' | awk -F\; -v OFS=\; '{$1=gensub(/\./, ";", 4, $1);$2=gensub(/\./, ";", 4, $2)}1' > scan.txt

    grep -v '([0-9]{1,3}\.){3}([0-9]){1,3};[0-9]{1,5};([0-9]{1,3}\.){3}([0-9]){1,3};[0-9]{1,5}' scan.txt

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 424
    Par défaut
    RTFM:
    Expressions rationnelles simples vs étendues
    Dans les expressions rationnelles simples, les méta-caractères ?, +, {, |, (, et ) perdent leur signification spéciale, il faut utiliser à la place leurs versions avec la contre-oblique \?, \+, \{, \|, \(,
    et \).

    La version traditionnelle d’egrep ne connaît pas le méta-caractère {, et certaines implantations d’egrep utilisent \{ à la place, si bien que des scripts shell portables devraient éviter { dans les motifs
    de grep -E et utiliser [{] pour désigner un caractère {.

    GNU egrep -E essaie d’émuler l’usage traditionnel en supposant que { n’est pas spécial au cas où il rendrait invalide l’expression qu’il commence. Par exemple, la commande shell grep -E ’{1’ recherche la
    chaîne composée des deux caractères {1 au lieu de signaler une erreur de syntaxe dans l’expression rationnelle. POSIX.2 permet ce comportement comme une extension à la norme, mais les scripts portables
    devraient l’éviter.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2019
    Messages : 12
    Par défaut
    Merci pour ta réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -E '([0-9]{1,3}\.){3}([0-9]){1,3}[;][0-9]{1,5}[;]([0-9]{1,3}\.){3}([0-9]){1,3}[;][0-9]{1,5}'

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 014
    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 : 3 014
    Par défaut
    Tu peux enlever les crochets autour des points virgules, ils ne sont pas nécessaires. Aussi les groupes qui sont inutiles: ([0-9]){1,3}

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2019
    Messages : 12
    Par défaut
    Merci pour ta réponse Cosmo.

    Pourquoi il y a des groupes inutiles ?

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 014
    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 : 3 014
    Par défaut
    Celui que je t'ai mis en exemple ne groupe rien.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2019
    Messages : 12
    Par défaut
    Je fais des tests de regex sur un site online mais si j’enlève les groupes que tu dis, il ne reconnait pas : 192.168.10.10;443;192.168.20.2;5555

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 305
    Par défaut
    Bonjour

    [0-9] désigne un seul caractère.
    Grouper un seul caractère ne sert à rien.
    C'est le groupe qui est pointé du doigt. Pas son contenu. Ni son indication de quantité.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 083
    Par défaut
    Bonsoir,
    Pouvez-vous me donner le lien pour mes tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Je fais des tests de regex sur un site online
    Comment ça marche groupage? Que fait [0-9]{1,3}?

    D'avance merci.

  10. #10
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Tu sélectionne de 1 à 3 {1,3) chiffre de 0 à 9 [0-9]

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2019
    Messages : 12
    Par défaut
    Merci pour vos réponses,


    Et bien c'est bien de 1 à 999 ? pour ([0-9]){1,3}

    https://www.regextester.com/97040

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 424
    Par défaut
    Oui, mais les parenthèses ici sont inutiles car [0-9] est une classe de caractère à part entière et donc en vouloir de 1 à 3, la syntaxe [0-9]{1,3} est suffisante.
    En gros, ça se lit comme: je veux 1 à 3 fois la classe de caractère 0 à 9.

    Par contre, quand on veux par exemple 1 à 3 fois le mot "foobar", là, oui, les parenthèses sont utiles car c'est la capture du mot que l'on veut et donc ça donnerait: (foobar){1,3}.

  13. #13
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    une alternative parmi d'autres :
    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
    #!/bin/bash
     
    regex="(?:|25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(?:|25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(?:|25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(?:|25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])"
     
    while read line; do
       printf "%-20s : " "$line"
       z=$(grep -Eo --color=always "$regex" <<< "$line")
       [[ $? -eq 0 ]] && echo "valide      ($z)" || echo "non-valide"
    done <<< "1.1.1.1
    1.1.1.0
    1.1.0.1
    1.0.1.1
    0.1.1.1
    0.0.0.0
    12.34.56.78
    127.0.0.1
    192.168.200.3
    255.255.255.255
    666.666.666.666
    255.0.0.1
    256.0.0.1
    1.1.1.255
    1.1.1.256"
    et le résultat :
    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
    1.1.1.1              : valide      (1.1.1.1)
    1.1.1.0              : non-valide
    1.1.0.1              : valide      (1.1.0.1)
    1.0.1.1              : valide      (1.0.1.1)
    0.1.1.1              : non-valide
    0.0.0.0              : non-valide
    12.34.56.78          : valide      (12.34.56.78)
    127.0.0.1            : valide      (127.0.0.1)
    192.168.200.3        : valide      (192.168.200.3)
    255.255.255.255      : valide      (255.255.255.255)
    666.666.666.666      : non-valide
    255.0.0.1            : valide      (255.0.0.1)
    256.0.0.1            : valide      (56.0.0.1)
    1.1.1.255            : valide      (1.1.1.255)
    1.1.1.256            : valide      (1.1.1.25)
    • la regex est longue, car les zéros sont autorisés pour les 2e et 3e nombres de l'IP, et interdits pour les 1er et dernier nombres (typiquement 127.0.0.1 VS 0.1.1.0)
    • pour chaque nombre de l'IP on match dans l'ordre et en éliminant chaque cas/tranche (on match d'abord ".255" avant de matcher ".2" par exemple)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      (?:|
      25[0-5]|        # 250 à 255 inclus
      2[0-4][0-9]|    # 200 à 249 inclus
      1[0-9][0-9]|    # 100 à 199 inclus
      [1-9][0-9]|     # 10 à 99 inclus
      [1-9]           # 1 à 9 inclus
      )\. etc.
    • le regex n'est pas la même selon qu'on utilise grep -E ou grep -P, j'aime bien grep -P, oh, oui, j'aime bien...
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      regex="(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])"      # grep -P
      regex="(?:|25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(?:|25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(?:|25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(?:|25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])"  # grep -E

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2019
    Messages : 12
    Par défaut
    Ah d'accord merci pour vos réponses.

    Les deux syntaxes sont bonnes juste lors de la lecture ce n'est pas logique.

    Je vais modifier cela.

Discussions similaires

  1. [grep] Une question sur les expressions régulières
    Par Bahan_auboulot dans le forum Linux
    Réponses: 5
    Dernier message: 04/12/2008, 20h12
  2. Question sur Grep
    Par zbouboy dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 16/02/2007, 00h56
  3. Une tite question sur Grep()
    Par bluecurve dans le forum Langage
    Réponses: 16
    Dernier message: 16/07/2005, 16h47
  4. Réponses: 2
    Dernier message: 11/08/2002, 22h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 17h11

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