[Perl] Retour à Perl - parser une sortie de commande multiligne

Stéphane Gigandet biz at joueb.com
Dim 9 Fév 00:52:03 CET 2020


Hello Nicolas,

Comme la sortie est toujours de la forme "clé : valeur" (avec 2 paires 
clés / valeurs sur chaque ligne), le plus simple c'est peut être de 
parser toutes les clés en un coup, sans découper chaque ligne dans un 
tableau, avec un truc de ce genre là :

#!/usr/bin/perl -w

use strict;

my $result = `cat result`;

my %values = ();

while ($result =~ /\s*([^:]+):\s+(.*?)(  |\n)/g) {
         $values{$1} = $2;
}

foreach my $key (sort keys %values) {
         print "$key : $values{$key}\n";
}

Ca donne ça :

ACTIVE PVs : 1
AUTO ON : yes
AUTO SYNC : no
BB POLICY : relocatable
CRITICAL VG : no
DISK BLOCK SIZE : 512
FREE PPs : 21 (2688 megabytes)
FS SYNC OPTION : no
HOT SPARE : no
INFINITE RETRY : no
LTG size (Dynamic) : 512 kilobyte(s)
LVs : 28
MAX LVs : 256
MAX PPs per PV : 1016
MAX PPs per VG : 32512
MAX PVs : 32
OPEN LVs : 22
PP SIZE : 128 megabyte(s)
PV RESTRICTION : none
QUORUM : 2 (Enabled)
STALE PPs : 0
STALE PVs : 0
TOTAL PPs : 799 (102272 megabytes)
TOTAL PVs : 1
USED PPs : 778 (99584 megabytes)
VG DESCRIPTORS : 2
VG IDENTIFIER : 00f702be00004c0000000159122168ad
VG PERMISSION : read/write
VG STATE : active
VOLUME GROUP : rootvg

Bon dimanche,

Stéphane

Le 08/02/2020 à 21:56, Nicolas a écrit :
> Bonsoir,
>
> Après de (trop) nombreuses années à ne pas faire d'admin, je remets 
> (laborieusement) les mains dans le cambouis... et donc dans perl ;o)
>
> Je n'ai jamais eu un niveau "gourou" en perl (même il y a 15ans) mais 
> j'arrive encore à écrire du code qui me donne le résultat attendu.... 
> alors ça me convient ;o)
> Mais du coup je vais peut-être avoir une question "bête" concernant le 
> traitement de la sortie d'une commande.
>
> La commande fournit une sortie sur STDOUT que je stocke dans un 
> tableau via :
> my @array=split(/\n/,`ma_super_commande_UNIX`) or die "error while 
> processing command \"ma_super_commande_UNIX\"";
>
> Ensuite je fais une boucle pour parcourir le tableau et appliquer la 
> bonne regexp afin de récupérer les parties "ah-hoc" de chaque ligne et 
> les stocker dans un hash avec les bonnes clés.
>
> La boucle est de la forme :
> foreach my $scalar (@array)
> {
>   if ( $scalar =~ m/VG IDENTIFIER:\s+(\S+)/ )
>   {
>     $hash{$stanza}{'VGid'}=$1;
>   }
> }
>
> En répétant les "if" dans la boucle (un "if" par ligne à traiter avec 
> la regexp associée) je peux matcher chaque ligne "qui va bien" par 
> exécution de la commande et ainsi récupérer les 2 valeurs par ligne 
> qui m'intéressent.
>
> A la place du "if" j'ai essayé une notation de la forme :
>     ($hash{$stanza}{'VGid'}, )=( $scalar =~ m/VG IDENTIFIER:\s+(\S+)/ );
>
> Mais ceci a pour seul résultat de bien matcher la bonne ligne dans la 
> boucle, mais au "tour suivant" de la boucle (ligne suivante stockée 
> dans @array) alors la valeur est "mise à zéro", ceci sans doute car du 
> coup la regexp ne match pas ce qui est assez logique puisque ce n'est 
> plus la bonne ligne.
> J'ai donc certainement loupé un truc quelque part.....
> Je peux bien entendu garder ma ribambelle de "if" à l'intérieur de la 
> boucle mais..... je pense qu'il y a plus simple / plus perl et que je 
> ne suis pas loin..... :(
>
> J'ai mis, un exemple de sortie de commande en fin de mail, je récupère 
> les 1 ou 2 valeurs par ligne pour stocker la 30aine de valeurs dans un 
> hash.
>
> Bonne soirée,
> Nicolas
>
> VOLUME GROUP:       rootvg                   VG IDENTIFIER: 
> 00f702be00004c0000000159122168ad
> VG STATE:           active                   PP SIZE:        128 
> megabyte(s)
> VG PERMISSION:      read/write               TOTAL PPs:      799 
> (102272 megabytes)
> MAX LVs:            256                      FREE PPs:       21 (2688 
> megabytes)
> LVs:                28                       USED PPs:       778 
> (99584 megabytes)
> OPEN LVs:           22                       QUORUM:         2 (Enabled)
> TOTAL PVs:          1                        VG DESCRIPTORS: 2
> STALE PVs:          0                        STALE PPs:      0
> ACTIVE PVs:         1                        AUTO ON:        yes
> MAX PPs per VG:     32512
> MAX PPs per PV:     1016                     MAX PVs:        32
> LTG size (Dynamic): 512 kilobyte(s)          AUTO SYNC:      no
> HOT SPARE:          no                       BB POLICY: relocatable
> PV RESTRICTION:     none                     INFINITE RETRY: no
> DISK BLOCK SIZE:    512                      CRITICAL VG:    no
> FS SYNC OPTION:     no
>
>
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl
> Attention, les archives sont publiques




Plus d'informations sur la liste de diffusion Perl