|
|
|
|
Bonjour,
je suis débutant en perl ... voici la situation :
je part d'un fichier, ou d'une variable, peut importe ... ce fichier contient plusieurs lignes avec du texte et une valeur ( il s'agit de % d'utilisation et de noms de Filesystem )
ex:
/app 80%
/bin 30%
/toto 25%
je voudrais savoir comment extraire UNIQUEMENT la ligne dont le pourcentage est supérieur à 50% ...
j'arrive à lire un fichier ligne par ligne ... j'arrive à chercher un mot bien précis dans du texte, mais pas à n'extraire qu'une ligne, celle qui contient ce que je cherche ...
Merci de votre aide !!
Configuration: Linux Firefox 2.0.0.8
Bonjour,
|
Salut,
root@debian:~/trash# cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;
while (<>){
print if /\s(?:[5-9]\d|\d{3,})%/;
}
__END__
root@debian:~/trash# cat phoenix
/app 80%
/bin 30%
/toto 25%
root@debian:~/trash# perl ccm.pl phoenix
/app 80%
root@debian:~/trash# df -h | perl ccm.pl
/dev/hda1 8,8G 5,4G 3,0G 65% /
/home/jacques/a.iso 571M 571M 0 100% /media/cdrom0
je vais t'expliquer plus tard, j'ai améliorer la regex ;-)
lami20j |
Whaoo !
|
Voilà le script modifié : #! /bin/bash
# Décommenter pour débuguer
#set -xv
while read ligne
do
# On récupère dans une variable le résultat de la commande "grep -o"
#+ "grep -o" ne récupère que le motif correspondant à l'expression régulière mise entre guillemets
#++ dans ton cas, au moins un chiffre (ou plusieurs) suivi(s) du caractère "%"
#+++ le "<<<$variable" est une façon plus simple de lire une variable sur le flux d'entrée
num=$(grep -o '[0-9][0-9]*%' <<<$ligne)
# On compare la valeur de la variable en l'amputant du caractère "%" à l'aide de l'expansion des
#+ variables, voir le man bash à ce sujet
#++ et on redirige les erreurs dues à une variable vide vers le néant
if [ "${num/\%/}" -ge 50 ] 2>/dev/null
then echo "$ligne"
fi
done < "$1";-))
Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
#!/usr/bin/perl
use strict;use warnings;
while (<>){ # cette opérateur permet de lire les lignes
# des fichiers passer en arguments
print if /\s(?:[5-9]\d|\d{3,})%/; # affiche seulement les lignes
# qui correspondent à la regex
}
__END__
/\s(?:[5-9]\d|\d{3,})%/
\s - reconnaît un espace (?: ) permet le regroupement sans capture 1er alternative [5-9]\d [5-9]\d - trouves toutes les nombre plus grands que 50 jusqu'à 99 [5-9] - c'est une classe de caractères qui permet de reconnaître 5,6,7,8 ou 9 \d - c'est une classe de caractères qui reconnaît les chiffres de 0 à 9 donc on peut la lire comme ça 50 51 . . 59 60 . .69 . . 90 . . 99 2ème alternative \d{3,} reconnaît les nombres de minimum 3 chiffres elle peut être améliorer vu qu'on cherche les nombres plus grand que 100 ce qui donne [1-9]\d{2,} - nous n'avons pas besoin de reconnaître un group de minimum 3 chiffres qui commence avec 0 l'alternative | - permet de reconnaître soit la partie gauche soit la partie droite de l'alternative Voici l'exemple avec la regex modifiée lami20j@debian:~/trash$ cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;
while (<>){
print if /\s(?:[5-9]\d|[1-9]\d{2,})%/;
}
__END__
lami20j@debian:~/trash$ df -h | perl ccm.pl
/dev/hda7 9,2G 4,6G 4,2G 52% /
/dev/hda8 28G 15G 12G 56% /home
lami20j |
Un grand merci à lami20j & jipicy !! :)
|
Salut,
open LOG,"../logs/cluster/status_cluster.log"
or die "E/$ : $!\n";
open MONFILE,">../logs/instances/pb_instances.txt"
or die "E/S : $!\n";
while (<LOG>){
print MONFILE "Attention, une instances ne tourne pas :\n $contenu \n" if /\bnot\b/;
}
close(monFile);
Par convention c'est bien d'utiliser les majuscules pour handle de fichier lami20j |
Bonjour,
|
lami20j@debserv:~/trash$ cat aa
ligne1 80%
ligne2 85%
ligne1 87%%
ligne1 100%
ligne1 10%
lami20j@debserv:~/trash$ perl -ne 'print if /(?:8[5-9]|9[0-9]|[1-9]\d{2,})/' aa
ligne2 85%
ligne1 87%%
ligne1 100%Cette fois il y a besoin de 3 alternatives
une pour 85 ... 89 une pour 90 ... 99 une pour 100............. Dans ton exemple [8-9][5-9] ne peux reconnaître que 85 à 89 95 à 99 mais il te manque de 90 à 94 lami20j |
Salut,
lami20j@debserv:~/trash$ cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;
while(<>){
(my $val) = $_ =~ /\D(\d+)%/;
next unless $val;
print if $val >= 85;
}
lami20j@debserv:~/trash$ cat aa
ligne1 80%
ligne2 85%
ligne1 87%%
ligne1 100%
ligne1 10%
lami20j@debserv:~/trash$ perl ccm.pl aa
ligne2 85%
ligne1 87%%
ligne1 100%
lami20j |