Script pour parser fichier txt
Fermé
encarnado
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012
-
Modifié par encarnado le 30/10/2012 à 11:06
encarnado Messages postés 4 Date d'inscription mardi 30 octobre 2012 Statut Membre Dernière intervention 30 octobre 2012 - 30 oct. 2012 à 14:24
encarnado Messages postés 4 Date d'inscription mardi 30 octobre 2012 Statut Membre Dernière intervention 30 octobre 2012 - 30 oct. 2012 à 14:24
A voir également:
- Script pour parser fichier txt
- Fichier rar - Guide
- Script vidéo youtube - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
3 réponses
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 098
30 oct. 2012 à 11:19
30 oct. 2012 à 11:19
Salut encarnado,
Ton script a de nombreux problèmes.
Entre autres :
- il ne récupère pas le résultat de apachectl fullstatus
- il ne crée aucun fichier avec quoi que ce soit dedans
- il utilise un descripteur de fichier "FILE" ne correspondant à aucun fichier ouvert
- il recherche "octobre" ?
- en tout état de cause cela ne serait pas if ( $_ =~ /\s(\d+\s$substring)/ ) mais plutôt if ( /\s(\d+\s$substring)/ ) mais je ne comprend pas ce que tu captures et cela ne correspond certainement pas à ce que tu dois récupérer
- == est l'opérateur d'égalité, pour l'affectation, c'est $reqpsec = $1;
- etc.
Si apachectl est dans le path, et que tu n'as pas besoin de stocker la sortie de la commande dans un fichier pour un autre usage, tu peux récupérer le résultat de la commande dans $_ et procéder comme cela :
C'est une base de travail, mais je crois que tu as sérieusement besoin de revoir les bases de Perl.
Dal
Ton script a de nombreux problèmes.
Entre autres :
- il ne récupère pas le résultat de apachectl fullstatus
- il ne crée aucun fichier avec quoi que ce soit dedans
- il utilise un descripteur de fichier "FILE" ne correspondant à aucun fichier ouvert
- il recherche "octobre" ?
- en tout état de cause cela ne serait pas if ( $_ =~ /\s(\d+\s$substring)/ ) mais plutôt if ( /\s(\d+\s$substring)/ ) mais je ne comprend pas ce que tu captures et cela ne correspond certainement pas à ce que tu dois récupérer
- == est l'opérateur d'égalité, pour l'affectation, c'est $reqpsec = $1;
- etc.
Si apachectl est dans le path, et que tu n'as pas besoin de stocker la sortie de la commande dans un fichier pour un autre usage, tu peux récupérer le résultat de la commande dans $_ et procéder comme cela :
#!/usr/bin/perl use strict; use warnings; my $exec = "apachectl fullstatus"; $_ = qx{$exec}; print "Resultat :\n$_\n"; my $req_sec = ""; my $b_sec = ""; if ( /([.0-9]+)\srequests\/sec\s-\s([0-9]+)\sB\/second.*/ ) { $req_sec = $1; $b_sec = $2; print "J'ai trouvé : req_sec = $req_sec et b_sec = $b_sec\n"; } else { print "Erreur : req_sec / b_sec introuvables\n"; }
C'est une base de travail, mais je crois que tu as sérieusement besoin de revoir les bases de Perl.
Dal
encarnado
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012
30 oct. 2012 à 11:29
30 oct. 2012 à 11:29
Merci de ton aide. Le problème c'est que je n'ai pas de bases perl j'ai lu des cours sur le net mais c'est tout et il faut que je fasse ce script d'ici la semaine prochaine.
Pour octobre j'ai éditer pour remettre la bonne recherche (pour tester en local sur mon poste je remplace la commande apache par un ipconfig /all).
En tout cas le script que tu me propose me permet de mieux comprendre ce que je doit faire, je vais faire avec ça et posterais d'une fois que j'aurais avancer pour les dernières correction.
Encore merci de tona ide.
Pour octobre j'ai éditer pour remettre la bonne recherche (pour tester en local sur mon poste je remplace la commande apache par un ipconfig /all).
En tout cas le script que tu me propose me permet de mieux comprendre ce que je doit faire, je vais faire avec ça et posterais d'une fois que j'aurais avancer pour les dernières correction.
Encore merci de tona ide.
encarnado
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012
Modifié par encarnado le 30/10/2012 à 11:54
Modifié par encarnado le 30/10/2012 à 11:54
Suite au retour de DAL j'ai corrigé mon script (en gras les points pour lesquels je pense que c'est faux) alors ça donne :
#!C:\Perl\bin
use strict;
use warnings;
# ========================================
# Execution de la commande apachectl fullstatus et préparation pour l'analyse du résultat de la commande
my $exec = "apachectl fullstatus";
$_ = qx{$exec};
print "Resultat :\n$_\n";
# ========================================
# Recherche du nombres de requêtes par seconde et du nombres d'octets apr seconde
my $req_sec = "";
my $b_sec = "";
if ( /([.0-9]+)\srequests\/sec\s-\s([0-9]+)\sB\/second.*/ )
{
$req_sec = $1;
$b_sec = $2;
} else
{
print "Erreur : req_sec / b_sec introuvables\n";
}
# ========================================
# Recherche du nombre de workers actifs, du nombre d'idle et calcul du pourcentage de workers occupés
my $workers_actifs = "";
my $idle = "";
my $pourcentage_workers_occupes = "";
if ( /([.0-9]+)\srequests currently being processed,\s\s([0-9]+)\sidle workers/ )
{
$workers_actifs = $1;
$idle = $2;
$pourcentage_workers_occupes = ($workers_actifs*100)/($workers_actifs+$idle);
} else
{
print "Erreur : workers_actifs / idle introuvables\n";
}
# ========================================
# Recherche du pourcentage de cache ssl
my $cache_ssl = "";
if ( /\scache usage :\s([0-9]+)\s%/ )
{
$cache_ssl = $1;
} else
{
print "Erreur : cache_ssl introuvables\n";
}
# ========================================
# Recherche de l'état des membres du loadbalancer
my $hostname = "";
my $status = "";
if ( /\ajp\s???????????\s/ ) # ici je doit récupéré le hostname et le OK de la ligne suivante : ajp hostname Init Ok 1 0 0 0 0
{
$hostname = $1;
$status = $2;
if ($status = "OK")
{
$status = 1;
} else
{
$status = 0;
}
} else
{
print "Erreur : hostname / status introuvables\n";
}
Merci de vos réponses.
#!C:\Perl\bin
use strict;
use warnings;
# ========================================
# Execution de la commande apachectl fullstatus et préparation pour l'analyse du résultat de la commande
my $exec = "apachectl fullstatus";
$_ = qx{$exec};
print "Resultat :\n$_\n";
# ========================================
# Recherche du nombres de requêtes par seconde et du nombres d'octets apr seconde
my $req_sec = "";
my $b_sec = "";
if ( /([.0-9]+)\srequests\/sec\s-\s([0-9]+)\sB\/second.*/ )
{
$req_sec = $1;
$b_sec = $2;
} else
{
print "Erreur : req_sec / b_sec introuvables\n";
}
# ========================================
# Recherche du nombre de workers actifs, du nombre d'idle et calcul du pourcentage de workers occupés
my $workers_actifs = "";
my $idle = "";
my $pourcentage_workers_occupes = "";
if ( /([.0-9]+)\srequests currently being processed,\s\s([0-9]+)\sidle workers/ )
{
$workers_actifs = $1;
$idle = $2;
$pourcentage_workers_occupes = ($workers_actifs*100)/($workers_actifs+$idle);
} else
{
print "Erreur : workers_actifs / idle introuvables\n";
}
# ========================================
# Recherche du pourcentage de cache ssl
my $cache_ssl = "";
if ( /\scache usage :\s([0-9]+)\s%/ )
{
$cache_ssl = $1;
} else
{
print "Erreur : cache_ssl introuvables\n";
}
# ========================================
# Recherche de l'état des membres du loadbalancer
my $hostname = "";
my $status = "";
if ( /\ajp\s???????????\s/ ) # ici je doit récupéré le hostname et le OK de la ligne suivante : ajp hostname Init Ok 1 0 0 0 0
{
$hostname = $1;
$status = $2;
if ($status = "OK")
{
$status = 1;
} else
{
$status = 0;
}
} else
{
print "Erreur : hostname / status introuvables\n";
}
Merci de vos réponses.
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 098
Modifié par [Dal] le 30/10/2012 à 12:12
Modifié par [Dal] le 30/10/2012 à 12:12
Il faut tester tes regexp sur la véritable sortie de la commande.
Sur la base de ce que tu as donné, on dirait que tu dois plutôt faire :
teste cela, ou adapte selon ta sortie réelle : https://perldoc.perl.org/perlretut
Dal
Sur la base de ce que tu as donné, on dirait que tu dois plutôt faire :
/([0-9]+)\srequests currently being processed,\s([0-9]+)\sidle workers/ /cache usage:\s([.0-9]+)%/ /ajp\s([^\s]+)\sInit\s([^\s]+)\s\d\s\d\s\d\s\d\s\d/
teste cela, ou adapte selon ta sortie réelle : https://perldoc.perl.org/perlretut
Dal
encarnado
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012
30 oct. 2012 à 14:24
30 oct. 2012 à 14:24
Normalement c'est exactement ça. Un grand merci pour ton aide.