Forum Programmation.perl Help pour script

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
8
juil.
2015

Je voudrais faire un nouveau fichier a partir d'un fichier source qui contient des valeurs. Mon vrai besoin c'est exploiter un report de scan nessus. Mon fichier de scan a cette structure

Numero de serie
12345677889

chiffrement du certif : SHA256

Numero de serie
23345677889

chiffrement du certif : SHA1

Numero de serie
26545677889

chiffrement du certif : SHA1

….
et je voudrais mettre ces infos dans un fichier mieux structurer pour faire des stats dans excel. Idealement je voudrais obtenir un fichier de la forme
Numero de serie,chiffrement du certif
12345677889,SHA256
23345677889,SHA1
26545677889,SHA1

  • # en awk

    Posté par  (site web personnel) . Évalué à 2. Dernière modification le 08 juillet 2015 à 21:36.

    awk -F ':' 'BEGIN { affiche_ligne=0 ; print "Numero de serie,chiffrement du certif" } \
    { if (affiche_ligne==1 ) { printf $0 "," ; affiche_ligne=0; }  } \
    /Numero de serie/ { affiche_ligne=1; } \
    /chiffrement du certif/ { print $2 }' fichier_de_donnees.txt > resultat.csv

    bon, il y a un espace en trop pour le chiffrement, mais bon…

    • [^] # Re: en awk

      Posté par  (site web personnel) . Évalué à 4. Dernière modification le 08 juillet 2015 à 21:52.

      Je ferais plutôt comme ça, avec un fichier reformat.awk

      BEGIN {
          FS=" *: *"
      }
      
      /Numero de serie/{
          flag = 1
          next
      }
      
      flag {
          ns = $1
          flag = 0
      }
      
      $1 == "chiffrement du certif" {
          printf("%s,%s\n", ns, $2);
      }
      

      puis

      % awk -f reformat.awk < input.text
      12345677889,SHA256
      23345677889,SHA1
      26545677889,SHA1```
    • [^] # Re: en awk

      Posté par  (site web personnel) . Évalué à 3.

      ou comme ça :)

      BEGIN {
          FS=" *: *"
      }
      
      (NR % 5) == 2 {
          ns = $1
      }
      
      (NR % 5) == 4 {
          printf("%s,%s\n", ns, $2);
      }
      
      • [^] # Re: en awk

        Posté par  (site web personnel) . Évalué à 2.

        là, tu supposes que chaque enregistrement affiche toujours les mêmes lignes, il peut y avoir des lignes supplémentaires parfois je pense, ce qui mettrait à mal ton "raccourci". Mieux vaut se baser sur des mots clés tout de même :-)

        (et oui, mon printf ne prend pas en compte de formatage, je fais souvent ce raccourci…).

        Je suis étonné que le FS accepte plus d'un caractère, ça plantait iirc, tant mieux si ça a évolué !

        • [^] # Re: en awk

          Posté par  (site web personnel) . Évalué à 2.

          Oui c'est encore plus fragile que la version avec les regexp mais je comprends qu'il s'agit d'un traitement unique, alors bon, autant en profiter!

          Le field splitter est en fait une expression rationnelle. Je n'ai pas le Awk Programming Language (par A, W and K) mais le sed & awk de chez O'Reilly laisse penser que le field splitter est une expression rationnelle dans le programme original.

          • [^] # Re: en awk

            Posté par  (site web personnel) . Évalué à 3.

            Le field splitter est en fait une expression rationnelle

            ça m'intéresserait de savoir depuis quand :-)
            C'est l'excuse que je donne encore à Excel lors de l'importation de CSV de ne pas savoir gérer plus d'un caractère : « awk ne fait pas mieux de toute façon… », même si côté awk le « | » permet d'avoir le choix entre deux caractères iirc (dans ma compréhension, ça a été pensé pour du CSV, la virgule en anglais, le point-virgule en français… sans voir plus loin). Si c'est en fait une regexp, c'est excellent, autant le proposer pour l'importation CSV côté Calc de LibreOffice :D (si cela n'a pas déjà été fait, au pire dans un onglet « utilisation avancée »).

            Bon, je vais regarder ce thread en espérant que quelqu'un propose quelque chose de faisable avec R qui est aussi une belle réussite :D (malgré un site web pourrite, un nom pourrite, mais d'une efficacité redoutable et scriptable pour traiter les données, à croire qu'il n'y a que des universitaires pour l'utiliser pour du big data…).

            • [^] # Re: en awk

              Posté par  (site web personnel) . Évalué à 2.

              à croire qu'il n'y a que des universitaires pour l'utiliser pour du big data…

              C'est aussi la technologie derrière l'outil machine leraning de AWS :)

              Est-ce que avec R on peut faire des “dashboards“ du genre

              1. Connecte toi à la MySQL x.y
              2. Fait une requête et dessine moi un graphe à partir des colonnes X, Y, Z (timeseries, disons)
              3. Tant que tu y es, fais moi une un histogramme et une fonction de répartition sur X, Y, Z
              4. Fais une calibration de X (disons) sur un modèle donné et fais moi un graphe qui compare la distribution calibrée à la distribution originale.

              Par exemple, à la fin j'ai une page web locale avec deux champs de date que je complète et il fait 1. 2. 3. et 4. ?

              • [^] # Re: en awk

                Posté par  . Évalué à 3.

                Cf par exemple le package R "Shiny" qui fait ça très bien.

                • [^] # Re: en awk

                  Posté par  (site web personnel) . Évalué à 2.

                  Excellent, c'est exactement le logiciel que j'avais envie d'écrire! Merci pour la référence.

              • [^] # Re: en awk

                Posté par  . Évalué à 2.

                Pour mélanger du code, des graphes et le tout sur un page web, le notebook d'IPython si tu connais le python ou celui de Jupyter pour plein d'autres langages est vraiment parfait.

            • [^] # Re: en awk

              Posté par  . Évalué à 3. Dernière modification le 09 juillet 2015 à 14:36.

              ça m'intéresserait de savoir depuis quand :-)

              Depuis 1987, si on en croît le manuel de GAWK. C'est en tout cas disponible dans l'implémentation de Kernighan, qui reflète ce qui est décrit dans The AWK Programming Language.

  • # en sed

    Posté par  (site web personnel) . Évalué à 5.

    Ton fichier reformat.sed

    /Numero de serie/{
      s/.*//
      N
      h
    }
    
    /chiffrement du certif/{
      s/.*: //
      H
      x
      s/^\n//
      s/\n/,/g
      p
    }
    

    puis

    % sed -n -f reformat.sed < input.text
    12345677889,SHA256
    23345677889,SHA1
    26545677889,SHA1
    26545677889,SHA1
    • [^] # Re: en sed

      Posté par  (site web personnel) . Évalué à 3. Dernière modification le 08 juillet 2015 à 22:00.

      classe :-) et en plus il n'y a pas l'espace surnuméraire.

      (et aussi illisible que le awk :p)

      heureusement qu'il y a ces langages dont la page de man en laisse dubitatif plus d'un, mais dont l'approfondissement permet de traiter efficacement des fichiers textes !

      à chaque fois que je dois relire un programme en sed ou en awk, cela me rappelle tout de même que http://www.ioccc.org/ existe encore ! (découvert dans Dr.Dobb's Journal au siècle dernier soit à La Villette, soit à la bibliothèque du centre Pompidou…).

      bon j'ai fait du flex/bison (remplaçants GNU de lex/yacc) aussi…

      • [^] # Re: en sed

        Posté par  (site web personnel) . Évalué à 2.

        Merci :D

        Si tu aimes bien le sed et le awk tu peux savourer les solutions que j'ai données à un petit puzzle sur CodeGolf SE: http://codegolf.stackexchange.com/questions/23259/do-we-sink-or-swim

        Je suis particulièrement fier de la solution sed ! :)

        • [^] # Re: en sed

          Posté par  (site web personnel) . Évalué à 3.

          la solution sed qui fait 128 caractères ? Le gagnant en a 30 :-)

          Bon, c'est rigolo de voir de l'APL (oui, j'en ai aussi fait, bien mathématique, mais très efficace, j'avais regardé Forth en même temps et ai toujours regretté de ne pas avoir de HP 48 :/)

          • [^] # Re: en sed

            Posté par  (site web personnel) . Évalué à 2. Dernière modification le 08 juillet 2015 à 23:13.

            la solution sed qui fait 128 caractères ? Le gagnant en a 30 :-)

            Pour moi le challenge était de faire un petit calcul avec sed – dont on peut s'accorder à dire qu'il n'est peut-être pas fait pout ça! :) Sinon j'ai aussi écrit la solution awk qui fait 70 caractères et arrive comme premier parmi les langages généralistes.

            • [^] # Re: en sed

              Posté par  . Évalué à 2.

              Ce qui est dommage c'est que ce soit le nombre de caractères qui soit compté. Si c'était plutôt le nombre de concepts, ce serait déjà une meilleure mesure de la complexité pour le cerveau humain. Par concepts j'entends le nombre de lexèmes, par exemple, même si sans doute certains lexèmes, suivant s'ils représentent des fonctions plus ou moins compliquées, suivant s'il s'agit de built-in ou non, devraient avoir des poids différents aussi. À mon avis la solution awk ne s'en sortirait pas moins bien que J, APL, etc. sur l'exemple donné, même si ce n'est peut-être pas non plus le langage le plus naturel pour le problème.

              • [^] # Re: en sed

                Posté par  (site web personnel) . Évalué à 2.

                Je trouve l'idée du Code Golfing assez amusante, mais en utilisant des langages spécialement écrits pour, je ne vois plus trop l'intérêt. Mais même si on ne triomphe pas en étant couvert de médailles d'or à la fin de la journée, on peut jouer avec ce qui est proposé et y trouver ses propres défis – j'aime bien le je fais tout avec sed et awk par exemple!

  • # En Perl

    Posté par  . Évalué à 4.

    Vite fait sur le gaz :

    perl -n -e '/^(\d+)/ and print "$1,"; /: (\w+)/ and print "$1\n"' input.dat
    • [^] # Re: En Perl

      Posté par  . Évalué à 4.

      Avec éventuellement un BEGIN, sinon point d'en-tête de colonnes :

      perl -n -e 'BEGIN { print "Numero de serie,chiffrement du certif\n"} /^(\d+)/ and print "$1,"; /: (\w+)/ and print "$1\n"' input.dat

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.