#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 ?
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
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 ?
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 ?
s/^(\d{2})(\d).*$/$1.$2/;
excuse je me suis trompé dans ma regex..
Merci ça marche
Hors ligne