Forum Programmation.shell Sed, awk & cie

Posté par  .
Étiquettes :
0
7
déc.
2007
Bonjour

J'essaie de traiter ce genre de flux (résultat de 'yum list')


kernel.i686 2.6.23.8-63.fc8 installed
kernel.i686 2.6.23.1-49.fc8 installed
kernel-devel.i686 2.6.23.8-63.fc8 installed
kernel-headers.i386 2.6.23.8-63.fc8 installed
arm-gp2x-linux-kernel-headers.noarch 2.6.12.0-2.fc8 fedora
kernel.i586 2.6.23.8-63.fc8 updates
kernel-PAE.i686 2.6.23.8-63.fc8 updates
kernel-PAE-debug.i686 2.6.23.8-63.fc8 updates
kernel-PAE-debug-devel.i686 2.6.23.8-63.fc8 updates
kernel-PAE-devel.i686 2.6.23.8-63.fc8 updates
kernel-debug.i686 2.6.23.8-63.fc8 updates
kernel-debug-devel.i686 2.6.23.8-63.fc8 updates
kernel-devel.i586 2.6.23.8-63.fc8 updates
kernel-doc.noarch 2.6.23.8-63.fc8 updates
kernel-xen.i686 2.6.21-2952.fc8 updates
kernel-xen-2.6-doc.noarch 2.6.21-2952.fc8 updates
kernel-xen-devel.i686 2.6.21-2952.fc8 updates
yum-kernel-module.noarch 1.1.8-1.fc8 fedora


J'aimerais récupérer dans 4 colonnes le nom, l'architecture, la version et enfin le numéro de release.
J'y arrive grâce à :

sed "s/\.fc8.*$//" | sed "s/-[0-9]*$/ &/" | sed "s/ -/ /" | sed -r "s/\.(noarch|i(3|5|6)86)/ &/" | sed "s/ ./ /" | awk '{ print $1 "\t" $2 "\t" $3 "\t" $4}'
mais je me demande s'il 'y aurait pas un peu mieux

Le résultat de sortie est :

kernel i686 2.6.23.8 63
kernel i686 2.6.23.1 49
kernel-devel i686 2.6.23.8 63
kernel-headers i386 2.6.23.8 63
arm-gp2x-linux-kernel-headers noarch 2.6.12.0 2
kernel i586 2.6.23.8 63
kernel-PAE i686 2.6.23.8 63
kernel-PAE-debug i686 2.6.23.8 63
kernel-PAE-debug-devel i686 2.6.23.8 63
kernel-PAE-devel i686 2.6.23.8 63
kernel-debug i686 2.6.23.8 63
kernel-debug-devel i686 2.6.23.8 63
kernel-devel i586 2.6.23.8 63
kernel-doc noarch 2.6.23.8 63
kernel-xen i686 2.6.21 2952
kernel-xen-2.6-doc noarch 2.6.21 2952
kernel-xen-devel i686 2.6.21 2952
yum-kernel-module noarch 1.1.8 1

  • # awk suffit

    Posté par  . Évalué à 3.


    awk '
    {
    split($1,tabnom,".");
    split($2,tabversionrelease,".");
    split(tabversionrelease[1],tabversion,"-");

    print tabnom[1]"\t"tabnom[2]"\t"tabversion[1]"\t"tabversion[2];
    } '


    Non testé mais l'idée est là
    • [^] # Re: awk suffit

      Posté par  . Évalué à 3.

      après test c'est plus ça :


      awk '
      {
      split($1,tabnom,".");
      split($2,tabtmp,"-");
      split(tabtmp[2],tabindex,".");

      print tabnom[1]"\t"tabnom[2]"\t"tabtmp[1]"\t"tabindex[1];
      } '
      • [^] # Re: awk plus joli en colonnes

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

        Avec un printf "format" , on peut bien aligner les colonnes,
        printf "%42s\t%5s\t%17s\t%6s\n" ...
        
        et ajouter un en-tête de titres au-dessus dans un bloc BEGIN{}. Pour ajuster les colonnes aux résultats, il faudrait mémoriser la longueur maximale de chacun des champs dans la boucle de lecture, et faire une boucle d'impression dans le bloc END...
  • # sans sed

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

    awk '{sub(/\./, "\t", $1); sub(/-/, "\t", $2); print $1 "\t" $2}'

    fait presque ce que tu veux (il ne reste que le .fc8 en trop).

Suivre le flux des commentaires

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