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

Programmation et administration système Perl Discussion :

Script perl RESEAU


Sujet :

Programmation et administration système Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut Script perl RESEAU
    Bonjour,
    Je suis actuellement débutantdans le langage perl, mais j'avance !!!

    Voila mon probleme j ai fichier de ce type:
    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
    ******************************************************
    ******************************************************
    [Groupe_TestA]				  chaine_A
     
    ACC-test	                            	  		  10.45.12.13
    ACC-Orange 			                  10.45.12.14
     
    [Batiment_testB]		                 	  chaine_B
     
    ACC-Rilo-6				  10.45.12.15
    ACC-Rilo-5				  10.45.12.16
    ACC-Rilo-4				  10.45.12.17
     
    [Batiment_testC]                                                          chaine_C
     
    ACC-Rilo-7				   10.45.12.18
    ACC-Rilo-8				   10.45.12.19
    **********************************************************
    **********************************************************
    Q1: Je souhaite recuperer les scalaires entre crochets pour les ecrire dans un nouveau fichier .

    Q2: Puis recupere le terme de chaine_A qui va etre utilisé comme champ de communaute snmp.En bref j en ai besoin commme variable !

    Q3: Pour finir j ai besoin de recuperer les @IP une apres l autre pour effectuer des taches snmp et passer ensuite au second terme entre crochet [] et refaire les meme manip.

    En bref ce qui est entre crochet correspond a un [groupe] et pour chaque groupe je veux recuperer le champ snmp et effectuer des tache avec les @ip d un meme groupe.


    J espere que j ai ete a peu pres clair sinon posez moi vos questions pour avoir des precisions.

    Merci d'avance pour votre aide

    Jules

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bienvenue à toi

    L'objet du forum n'est pas d'apporter des réponses "toutes prêtes" aux utilisateurs mais des indications. Nous acceptons volontiers de corriger des morceaux de codes et d'aider aux développements du style conseils.
    Comme tu es débutant, tu peux toujours te référer à notre FAQ ou à mes cours, ce qui te sera grandement utile pour acquérir rapidement les bases.

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

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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Pour faire plus simple est il possible d'extraire une info entre crochet ? Qui est contenue dans un fichier.

    merci Jules

  4. #4
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    oui en utilsant les expressions régulieres. Regarde dans la FAQ.
    courage!!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Oki merci pour ce coup de pouce.
    Mais le caractere crochet [ ne sera pas interprete comme une fonction ou un truc du genre lorsque je ferai / [ / ??
    Merci Jules

  6. #6
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Les caractères '[' ou ']' sont des caractères qui sont utilisés dans la syntaxe des regexs, il faut donc signaler au moteur de regex que tu veux les utiliser comme caractères littéraux dans ton cas, en les 'échappant' avec un antislash :
    Bonne chance. (et pose directement une question précise la prochaine fois, tu recevras la réponse bien plus rapidement)
    --
    Jedaï

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Je vois ca merci je vais maintenant fouille pour savoir ce que c'est que le moteur regex.
    A pluche pour la prochaine question

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Que signifie cette expression ?
    Merci d avance Jules

  9. #9
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Salut salut !
    Il faut savoir que @_ est un tableau particulier utilisé nottemment pour les paramètres des fonctions que tu appelles.
    Si ton $_[0] se trouve dans une fonction, il y a de très fortes chance qu'il représente le premier paramètre passé à cette fonction (rappel : le premier élément d'un tableau @tab est $tab[0]).

    Montre nous le bou de code qui contient cette expression, et on pourra t'en dire plus
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  10. #10
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Le moteur regex est simplement le code qui lit ta regex et la transforme en forme compréhensible par la machine, puis qui l'exécute.

    --
    Jedaï

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Voila j avance dans mes recherches mais je souhaite exploiter ce bout de prog dispo dans le cours mais je n y commprend pas tout !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @new = ();          # -----C est bien la declaration d un nouveau tableau 
    push(@new, $+)    #-----On empile les infos dans le tableau @new
     
    while $text =~ m{ #-----tant que le scalaire $text  n est as egal a la valeur de m
    "([^\"\\]*(?:\\.[^\"\\]*)*)",? #-----c est cense regrou^pe es guillement moi je voudrais les crochets je remplace dc " par [ puis " par ]
    | ([^,]+),?     #-----ca je ne comprends pas 
    | ,                #-----ca non plus
    }gx;           #----c est quoi ce gx ?
     
    push(@new, undef) if substr($text,-1,1) eq ’,’; #--que fait cette ligne .

    Ouis je sais ca fait beaucoupe de question mais notez que j avance en faisant mes recherches !!!!!
    Merci d'avance pour le coup de pouce
    jULES

  12. #12
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    while $text =~ m{ #-----tant que le scalaire $text n est as egal a la valeur de m

    Attention !
    =~ ne veux pas dire différent de, mais c'est ce que l'on appelle un bind, il lie $text à la regex.

    | ([^,]+),? #-----ca je ne comprends pas

    Le pipe | est un ou : ta regex renvoie une valeur vraie si elle reconnais l'un des motifs donné. Les différents motifs à matcher sont donc séparés par un pipe.

    Ensuite, pour le gx, ce sont des options des regex, tu en une liste dans la FAQ Perl. Ici, sauts de lignes et espaces ne sont pas pris en comptes et toutes les occurences sont recherchées.
    Le reste des regex, tu dois comprendre je pense Wink

    Je crois que la dernière ligne rajoute unfef à la fin du tableau si la dernière valeur de la chaîne $text est une virgule... A vérifier.

    €dit : c'est moi ou ce code est particulièrement moche ? J'ai du mal à croire que ça compile, manque un pont virgule après le push, il n'y a pas de bloc après le while...

    Si j'ai bien compris, les {} sont les séparateurs du match, donc où sont les accolades du while ?
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  13. #13
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Woufeil
    €dit : c'est moi ou ce code est particulièrement moche ? J'ai du mal à croire que ça compile, manque un pont virgule après le push, il n'y a pas de bloc après le while...

    Si j'ai bien compris, les {} sont les séparateurs du match, donc où sont les accolades du while ?
    Non, ici while est un modificateur d'instruction, accolé au push (donc il ne manque pas de ';' après le push), le code est correct.

    Par contre il est assez horrible et illisible pour un support de cours... surtout avec les commentaires en plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my @new;
     
    push(@new, $+) 
      while $text =~ m{ 
          "( [^\"\\]* (?:\\. [^\"\\]* )* )",? 
          | ([^,]+),? 
          | ,   
        }gx;  
     
    push(@new, undef) if substr($text,-1,1) eq ’,’;
    Déjà réindenté il a meilleure mine. Ce code reconnaît un certain format de CSV (comma separated value), où l'on peut mettre des ',' dans le contenu d'un des champs, mais en l'entourant de guillemets. Pour mettre un guillemet dans un tel champ, il faut alors "l'échapper" avec un antislash.

    Exemple :
    "ceci est une virgule : , et un guillemet : \" .",deuxième champ,trois,

    Cet exemple contient 4 champs dont le contenu est le suivant :
    1. ceci est une virgule : , et un guillemet : " .
    2. deuxième champ
    3. trois


    (on remarque que s'il y a une virgule à la fin, il y a un champ vide, d'où la dernière ligne du script qui vérifie si le dernier caractère est une virgule et rajoute un champ dans @new le cas échéant)

    Le modificateur /x sur une regex rend les espaces et les commentaires insignifiant pour le moteur de regex (autrement dit, pour vraiment matcher un espace, il faut utiliser '\s' ou pour être plus précis '\ '). Le modificateur /g indique qu'on veut matcher plusieurs fois : si le contexte de la regex est un contexte de liste, toutes les occurrences sont stockées dans le tableau directement, en contexte scalaire, le moteur de regex se 'souvient' jusqu'où il a matché la chaîne jusqu'ici et reprend le match suivant à partir de ce point.
    $+ est le contenu matché par la dernière parenthèse qui a réussi dans le dernier match effectué, cela sert lorsqu'on ne sait pas si on doit utiliser $1 ou $2 parce qu'on a utilisé une alternative '|' comme ici.

    --
    Jedaï

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Merci JEDAI pour ton aide,
    mais j ai encore des petites questions:

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     if ( ($ligneA) =~ /\[\S+\]\t+\S/  ) #
            {
            print($ligneA);
            print(" ok \n");
            }
    Dans mon expression reguliere je voudrai la preciser en selectionnant le contenu en tre crochet [contenu_a_selectionner]

    Jules

  15. #15
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     if ( ($ligneA) =~ /\[(\S+)\]\t+\S/  ) #
            {
            print "$1\n";
            print " ok \n";
            }
    --
    Jedaï

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Trop bon merci !!!!!!!!!Ben maintenant je vais continuer ma tache.

    Jules

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Ben je continue l'aventure PERL,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     if ($ligne eq "\n")
             {
                    $cpt++;
             }
             elsif ( ($ligne) =~ /\[(\S+)\]\t+\S/  ) #
             {
                    print "$1\n";
             }
     
             elsif ( ($ligne) =~ /[lan/]) #
             {
                    print ("$1 \n");
             }
    Voila mon bout de code qui me sort bien mes noms de groupe present entre crochets. Mais j ai sur la meme ligne une chaine caractère que j'aimerais également selectionner qui contien lan. Je ne sais pas si c est la variable $1 qui dans mon deuxieme elsif n est pas bon ou une autre erreur ???
    Merci d'avance pour votre aide.
    Jules

    Citation Perl tous les jours une nouvelle expression régulière.

  18. #18
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Oula, tu te complqiues la vie !
    Tu cherches une chaine qui comprend de 0 à n caractères quelconques puis les lettres lan puis de 0 à n caractères quelconques, et tu veux afficher cette chaîne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ($v =~ m/(.*lan.*)/)
    {
    	print "$1";
    }
    Ce code marche très bien. Je te conseille de bien lire la FAQ sur les regex, ainsi que la documentation de Sylvain Lhuillier sur le sujet.

    Bon code.
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Bonjour à tous pour cette nouvelle semaine de recherche avec PERL !
    Voila mon code qui est cense rechercher des nom de groupe entre crochets [] >>ca fonctionne !
    Mais dans le meme fichier je souhaite chercher des chaines carateres contenant "..lan.." mais j ai des erreurs et je n'arrive pas a les comprendre.
    Est ce que cela provient de la variable $1 ????

    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
     
    #!/usr/bin/perl
    use strict;
     
    # Vérification et ouverture du fichier base_Lan.txt pour la lecture
    open(Fichier_groupe,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! ");
    while ($ligne_= <Fichier_lan> )
    {
             if ( ($ligne_) =~ /\[(\S+)\]\t+\S/ ) #
             {
                    print "$1\n";
             }
     
             elsif (($ligne_) =~ /\Wlan/ )
             {
                    print ("$1 \n");
             }
    }
    close Fichier_lan;

    ----------------------------------------------
    Les erreurs :

    Global symbol "$ligne_" requires explicit package name at ./test2.pl line 6.
    Global symbol "$ligne_" requires explicit package name at ./test2.pl line 8.
    Global symbol "$ligne_" requires explicit package name at ./test2.pl line 13.
    Execution of ./test2.pl aborted due to compilation errors.


    Merci d avance Jules

  20. #20
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Si tu mets "use strict;" au début du script il faut que tu déclare toutes les variables avec my() (variable locale) ou our() (variable globale). Ceci permet d'éviter les petites fautes de frappes catastrophique où tu fait une erreur dans un nom de variable, ce qui introduit un bug subtil et parfois difficile à dépister dans les gros programme.

    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
     
    #!/usr/bin/perl
    use strict;
     
    # Vérification et ouverture du fichier base_Lan.txt pour la lecture
    open(Fichier_groupe,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! ");
    while ( my $ligne_= <Fichier_lan> )
    {
             if ( ($ligne_) =~ /\[(\S+)\]\t+\S/ ) #
             {
                    print "$1\n";
             }
     
             elsif (($ligne_) =~ /\Wlan/ )
             {
                    print ("$1 \n");
             }
    }
    close Fichier_lan;
    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [ Noob - Perl Reseau ] Script perl qui recupere les tables ARP des switches Cisco
    Par oneal42 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 04/09/2007, 11h11
  2. [langage] Script Perl Aide
    Par julfra dans le forum Langage
    Réponses: 7
    Dernier message: 17/05/2004, 09h55
  3. [langage] script perl cmd system
    Par kacedda dans le forum Langage
    Réponses: 4
    Dernier message: 02/05/2003, 09h45
  4. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26
  5. Réponses: 2
    Dernier message: 11/07/2002, 08h31

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