Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/10/2012, à 11:00

inserm

[Résolu] modifier une chaîne de caractères et convertir en nombre ?

J'ai testé un script qui a l'air de fonctionner pour mon matériel, mais je ne sais pas comment parser une valeur

En gros le script récupère la temperature capturé par une sonde et sur cette dernière que je fais les test
Voilà le script :

    #!/usr/bin/perl -w
    # nagios: -epn
    use strict;
    use warnings;
    use Switch;
    use lib "/usr/lib/nagios/plugins";
    use utils qw(%ERRORS $TIMEOUT);
    use Getopt::Long;
    use vars qw/$opt_host $opt_string $opt_sep $opt_verbose $opt_w $opt_c $opt_help/;

    #### Main

    get_options();
    $TIMEOUT=60;
    my $lynx   = '/usr/bin/lynx';
    my @input;
    my $command="$lynx -dump http://$opt_host | grep \"$opt_string\"";



    open(DATA,"$command|") || die "CRITICAL Could not execute $command";
    while(<DATA>) {
        chomp;
        push(@input,$_);
    }

    close(DATA);

    my $some_data_found=0;
    my $value;
    my $res='CRITICAL';
    my $nresult;
       foreach my $line (@input) {
          if ( $line =~ "$opt_string" ) {
             $some_data_found=1;
             $value = $line;
             $value =~ s/$opt_string//;
             $value =~ s/$opt_sep*//;
          # Extract number from $value
             $value =~ s/([0-9]*).*/$1/;
          }
       }
       
       if ( $value eq "" ) { print "CRITICAL Search string has no value !\n"; exit $ERRORS{'CRITICAL'}; }
       if ( defined($opt_w) ) { if ($value < $opt_w) {$res='OK';} else {$res='WARNING';} }
       if ( defined($opt_c) && ($res =~ 'WARNING'||!defined($opt_w)) ) { if ($value > $opt_c) {$res='CRITICAL';} }

    $nresult  = "$res ";
    $nresult .= "$opt_string $value";
    $nresult .= " | ";
    $nresult .= "$opt_string=$value";
    $nresult .= ";$opt_w" if ( defined($opt_w) );
    $nresult .= ";$opt_c" if ( defined($opt_c) );

    print ("$nresult\n");

    if ( !$some_data_found || $opt_verbose ) {
       print " CRITICAL No corresponding data has been found\nDebugging data: \n" if(!defined($opt_verbose));
       print "$command\n";
       foreach my $line (@input) {print "$line\n";}
       exit $ERRORS{'CRITICAL'};
    }
    exit $ERRORS{"$res"};

    #### END MAIN

    sub get_options {
        Getopt::Long::Configure( 'bundling' );
          GetOptions(
          'H:s'      => \$opt_host,      'host'      => \$opt_host,
          's:s'           => \$opt_string,        'string'        => \$opt_string,
          'k:s'           => \$opt_sep,           'separator'     => \$opt_sep,
          'v'      => \$opt_verbose,   'verbose'   => \$opt_verbose,
          'w:i'      => \$opt_w,      'warning'   => \$opt_w,
          'c:i'      => \$opt_c,      'critical'   => \$opt_c,
          'h'      => \$opt_help,      'help'      => \$opt_help,
                     );
       if ( defined($opt_help) ) { &print_help; exit $ERRORS{'CRITICAL'}; }
       if ( !defined($opt_string) ) { &print_help; exit $ERRORS{'CRITICAL'}; }
       if ( !defined($opt_sep) ) { $opt_sep=" "; }
      }
    sub print_help {
    print <<EOT;

    Usage: check_pmta_connections -i/-o -w -c -x -d
            -H  --hostn=<ip's of the server>
          This must be defined
       -s, --string
          The string that must precede the monitored value
          This MUST be defined
       -k, --separator
          If not defined is space
       -v, --verbose
                    print extra debugging information
       -w, --warning  = <warning threshold>
       -c, --critical = <critical threshold>
       -h, --help   This help

    EOT
    }   

quand je lance cette commande :

# ./check_string -H <my_ipadress>/tme.xml -s "Thermometer" -w 15 -c 25</code>
CRITICAL Thermometer 220150250 | Thermometer=220150250;15;25

comment parser la valeur 220150250 ? en 22 ou 22.0

voilà mon fichier tme.xml

<thermometer>
<title>Ethernet thermometer TME designed by Papouch s.r.o. - www.papouch.com</title>
<description>Thermometer</description>
<temperature>220</temperature>
<mintemperature>150</mintemperature>
<maxtemperature>250</maxtemperature>
</thermometer>

Ce que je veux comme résultat si quelqu'un peut m'aider :

# ./check_string -H <my_ipadress>/tme.xml -s "Thermometer" -w 15 -c 25
OK Thermometer 22 | Thermometer=22;15;25


# ./check_string -H <my_ipadress>/tme.xml -s "Thermometer" -w 15 -c 25
CRITICAL Thermometer 26 | Thermometer=26;15;25


# ./check_string -H <my_ipadress>/tme.xml -s "Thermometer" -w 15 -c 25
WARNING Thermometer 14 | Thermometer=14;15;25

Merci

edit modo : merci de poster dans la bonne section et de choisir des titres explicites à l'avenir.

Dernière modification par inserm (Le 29/10/2012, à 14:26)

Hors ligne

#2 Le 27/10/2012, à 21:09

cedric.amouyal

Re : [Résolu] modifier une chaîne de caractères et convertir en nombre ?

essaie ca
remplace
$value =~ s/([0-9]*).*/$1/;
par ca
$value =~ s/(\d+)\d$/$1/;

en gros tu enleves le dernier chiffre.
ou
$value =~ s/^(\d+)(\d)$/$1.$2/;
ca fait 220 ==> 22.0

Hors ligne

#3 Le 29/10/2012, à 09:45

inserm

Re : [Résolu] modifier une chaîne de caractères et convertir en nombre ?

cedric.amouyal a écrit :

essaie ca
remplace
$value =~ s/([0-9]*).*/$1/;
par ca
$value =~ s/(\d+)\d$/$1/;

J'ai testé avec ce changement toujour le même résultat:

# ./check_string -H <my_ipadress>/tme.xml -s "Thermometer" -w 15 -c 25
CRITICAL Thermometer 220150250 | Thermometer=220150250;15;25
cedric.amouyal a écrit :

en gros tu enleves le dernier chiffre.
ou
$value =~ s/^(\d+)(\d)$/$1.$2/;
ca fait 220 ==> 22.0

ça donne :

# ./check_string -H <my_ipadress>/tme.xml -s "Thermometer" -w 15 -c 25
CRITICAL Thermometer 22015025.0 | Thermometer=220150250;15;25

Ce que je veux :

# ./check_string -H <my_ipadress>/tme.xml -s "Thermometer" -w 15 -c 25
CRITICAL Thermometer 22.0 | Thermometer=220150250;15;25

C'est à dire avoir comme résultat 22.0 pas 22015025.0
C.f : Cette valeur est dans le fichire tme.xml entre la balise <temperature>220</temperature>

Merci

Hors ligne

#4 Le 29/10/2012, à 14:24

inserm

Re : [Résolu] modifier une chaîne de caractères et convertir en nombre ?

Merci
J'ai trouvé en rajoutant deux lignes:

	$value = substr($value,0,3);
			$value =~ s/^(\d+)(\d)$/$1.$2/;
			print "$value\n";

Hors ligne

#5 Le 29/10/2012, à 15:25

cedric.amouyal

Re : [Résolu] modifier une chaîne de caractères et convertir en nombre ?

Si tu veux que les 3 1er caractère ca devrait marcher avec ca aussi
$value =~ s/^(\d{2})(\d)/$1.$2/;

sans le substr...

Hors ligne

#6 Le 29/10/2012, à 15:43

inserm

Re : [Résolu] modifier une chaîne de caractères et convertir en nombre ?

cedric.amouyal a écrit :

Si tu veux que les 3 1er caractère ca devrait marcher avec ca aussi
$value =~ s/^(\d{2})(\d)/$1.$2/;

sans le substr...

J'ai testé ça donne ça : 22.0150250 et moi je veux 22.0 parce que la valeur que je récupéré : 220150250

Merci

Hors ligne

#7 Le 29/10/2012, à 18:35

cedric.amouyal

Re : [Résolu] modifier une chaîne de caractères et convertir en nombre ?

s/^(\d{2})(\d).*$/$1.$2/;
excuse je me suis trompé dans ma regex..

Hors ligne

#8 Le 05/11/2012, à 11:01

inserm

Re : [Résolu] modifier une chaîne de caractères et convertir en nombre ?

cedric.amouyal a écrit :

s/^(\d{2})(\d).*$/$1.$2/;
excuse je me suis trompé dans ma regex..

Merci ça marche smile

Hors ligne