[PERL]- Extraire lignes d'un fichier à partir [Résolu/Fermé]

Signaler
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
-
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
-
Bonjour,

je suis nouveau sur ce forum et je dois pour mon stage extraire les "nb" derinères lignes d'un fichier, les trier et les mettre dans un autre fichier.

En gros je voudrais faire cela en perl:
tail -$nb $fichier | sort -k 5 -u | sed -e 's/\[[0-9]*\]:/:/g' > $file.analyse

Au secours!!

36 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
Si jamais ça ne marchera pas comme tu voudras ça veut dire que j'ai mal compris ce que tu veux ;-)
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
je te tiendrais au courant d'ici 2h
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
j ai un ptiti probleme car toi tu n'a que des vmonitor suivi de ntpd alors que moi j'en ai plein d'autre comme xinetd, cvs, dhcpd, client, named, ntpd...
et donc ton script ne choisi que ceux qui possèdent ntpd et pas les autres.
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
Bonjour,
j'ai modifier cette ligne car pas tous avait des chiffre entre [] :
grep {s/.*(vmonitor\s*.*)\[*.*\]*(:\s*.*)/${1}$2/} @log;

pour kern.log c'est bon:

vmonitor:/var/adm/syslog.dated/current> more kern.log
Apr 10 03:30:37 vmonitor kernel: set_rtc_mmss: can't update from 58 to 0
Apr 10 03:31:39 vmonitor kernel: set_rtc_mmss: can't update from 59 to 1
Apr 10 08:30:13 vmonitor kernel: set_rtc_mmss: can't update from 58 to 0
Apr 10 08:31:14 vmonitor kernel: set_rtc_mmss: can't update from 59 to 1
vmonitor:/var/adm/syslog.dated/current> more kern.log.analyse
vmonitor kernel: set_rtc_mmss: can't update from 58 to 0
vmonitor kernel: set_rtc_mmss: can't update from 59 to 1
vmonitor kernel: set_rtc_mmss: can't update from 58 to 0
vmonitor kernel: set_rtc_mmss: can't update from 59 to 1

par contre j ai encore les chiffre entre [] pour celui ci:

vmonitor:/var/adm/syslog.dated/current> more daemon.log
Apr 10 12:26:20 vmonitor PREFIX: message de test
Apr 10 12:26:50 vmonitor PREFIX[6161]: message de test
Apr 10 12:35:45 vmonitor ntpd[31161]: Listening on interface
vmonitor:/var/adm/syslog.dated/current> more daemon.log.analyse
vmonitor ntpd[31161]: Listening on interface
vmonitor PREFIX: message de test
vmonitor PREFIX[6161]: message de test


Comment faire pour enlever les doublons??
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
j ai essayer cela est sa marche:
grep {s/.*(vmonitor\s*[a-zA-Z]*)\[?\d*\]?(:\s*.*)/${1}$2/} @log;


vmonitor:/var/adm/syslog.dated/current> more daemon.log.analyse
vmonitor ntpd: Listening on interface
vmonitor PREFIX: message de test
vmonitor PREFIX: message de test
vmonitor:/var/adm/syslog.dated/current> more kern.log.analyse
vmonitor kernel: set_rtc_mmss: can't update from 58 to 0
vmonitor kernel: set_rtc_mmss: can't update from 59 to 1
vmonitor kernel: set_rtc_mmss: can't update from 58 to 0
vmonitor kernel: set_rtc_mmss: can't update from 59 to 1



:))
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
par contre comment éviter les doublons? cad deux même lignes?
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
Salut,

pour enlever les doublons un hash peut être utilisé
malheuresment j'ai beaucoup de boulot aujourd'hui

je vais regarder ce soir

j'ai modifier cette ligne car pas tous avait des chiffre entre [] :
grep {s/.*(vmonitor\s*.*)\[*.*\]*(:\s*.*)/${1}$2/} @log;


justement c'est pour ça que j'ai utiliser
grep {s/.*(vmonitor\s*ntpd)\[.*\](:.*)/${1}$2/} @log;
j'ai utiliser . qui veut dire n'importe quel caracère, en supposant que tu as autre chose que chiffres


attention tu as mal copier la ligne, il n'y a pas d'étoile avant le .


Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
ha oui j'ai vu
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
o fait petit probleme:
le script etait :grep {s/.*(vmonitor\s*ntpd)\[.*\](:.*)/${1}$2/} @log;
print ECRIRE map  {$_->[0]}
             sort {$a->[1] cmp $b->[1]}
             map  {[$_,(split / /)[4]]}
             splice(@log,-$n);


et donc pour les lignes du genre:
Apr 9 15:58:32 vmonitor ntpd[31608]: ntpd 4.2.0a@1.1190-r Thu Oct 5 04:11:32 EiDT 2006 (1)
Apr 9 15:58:32 vmonitor ntpd[31608]: precision = 17.000 usec

Changement de programme car ce script va alé sur plusieurs machines et donc le vmonitore sera changé:
Apr 9 15:58:32 zulu ntpd[31608]: precision = 17.000 usec
Apr 9 15:58:32 chateau ntpd[31608]: Listening on interface wildcard, 0.0.0.0#123

comment faire pour generaliser et enlever ces fichus "[chiffres]"?
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
comment faire pour generaliser et enlever ces fichus "[chiffres]"?

tu parles de quelles chiffres
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
ceux la:

Apr 9 15:58:32 zulu ntpd[31608]: precision = 17.000 usec
Apr 9 15:58:32 chateau ntpd[355588]: Listening on interface wildcard, 0.0.0.0#123

je veux enlever tout ce qui est souligné
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
Ben justemement cette partie (voir en gras) traite n'importe quoi, y compris les chiffres
ntpd)\[.*\](:.*)/
--
106485010510997108
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
meme si avant on a:

grep {s/.*(vmonitor\s*ntpd)\[.*\](:.*)/${1}$2/} @log;

car cette fois ci on a plus vmonitor only mais par exemple zulu ou chateau
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
alors essaie
grep {s/.*(\w+\s*ntpd)\[.*\](:.*)/${1}$2/} @log; 
--
106485010510997108
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
merci
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
Bon, voici un exemple, tester sur le fichier tonixm.log
donc j'ai pris tes lignes et je les ai multipliés
tu remarques bien que j'ai changé les valeurs pour précision pour mettre en evidence le tri
si j'ai bien compris ce sont les lignes qui contiennent le mot precision qui t'interesse

donc d'abord je selecte seulement les lignes contenant le mot precision (5 dans ce cas) et je vais traiter seulement les 3 dernières lignes

ensuite je vais traiter selons le champe se trouvant après le signe =
sort -k 5 veut dire que le tri se fait en commencant avec le champ 5 (le séparateur étant l'espace)

lami20j@debian:~$ cat tonixm.log
Apr 9 15:58:32 vmonitor ntpd[31608]: ntpd 4.2.0a@1.1190-r Thu Oct 5 04:11:32 EiDT 2006 (1)
Apr 9 15:58:32 vmonitor ntpd[31608]: precision = 17.000 usec
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, 0.0.0.0#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, ::#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface lo, 127.0.0.1#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface eth0, 172.16.15.39#123
Apr 9 15:58:32 vmonitor ntpd[31608]: kernel time sync status 0040
Apr 9 15:58:32 vmonitor ntpd[31608]: ntpd 4.2.0a@1.1190-r Thu Oct 5 04:11:32 EiDT 2006 (1)
Apr 9 15:58:32 vmonitor ntpd[31608]: precision = 14.000 usec
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, 0.0.0.0#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, ::#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface lo, 127.0.0.1#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface eth0, 172.16.15.39#123
Apr 9 15:58:32 vmonitor ntpd[31608]: kernel time sync status 0040
Apr 9 15:58:32 vmonitor ntpd[31608]: ntpd 4.2.0a@1.1190-r Thu Oct 5 04:11:32 EiDT 2006 (1)
Apr 9 15:58:32 vmonitor ntpd[31608]: precision = 13.000 usec
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, 0.0.0.0#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, ::#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface lo, 127.0.0.1#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface eth0, 172.16.15.39#123
Apr 9 15:58:32 vmonitor ntpd[31608]: kernel time sync status 0040
Apr 9 15:58:32 vmonitor ntpd[31608]: ntpd 4.2.0a@1.1190-r Thu Oct 5 04:11:32 EiDT 2006 (1)
Apr 9 15:58:32 vmonitor ntpd[31608]: precision = 18.000 usec
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, 0.0.0.0#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, ::#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface lo, 127.0.0.1#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface eth0, 172.16.15.39#123
Apr 9 15:58:32 vmonitor ntpd[31608]: kernel time sync status 0040
Apr 9 15:58:32 vmonitor ntpd[31608]: ntpd 4.2.0a@1.1190-r Thu Oct 5 04:11:32 EiDT 2006 (1)
Apr 9 15:58:32 vmonitor ntpd[31608]: precision = 10.000 usec
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, 0.0.0.0#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface wildcard, ::#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface lo, 127.0.0.1#123
Apr 9 15:58:32 vmonitor ntpd[31608]: Listening on interface eth0, 172.16.15.39#123
Apr 9 15:58:32 vmonitor ntpd[31608]: kernel time sync status 0040

Le script
lami20j@debian:~$ cat log.pl
#!/usr/bin/perl
use strict;use warnings;

open LIRE,"tonixm.log"
     or die "E/S : $!\n";

my @tmp = <LIRE>;
my @log = grep {/precision/} @tmp;

grep {s/.*(vmonitor\s*ntpd).*(precision.*)/$1: $2/} @log;
print map  {$_->[0]}
      sort {$a->[1] cmp $b->[1]}
      map  {[$_,(split /=/)[1]]}
      splice(@log,-3);

__END__
Le résultat
lami20j@debian:~$ perl log.pl
vmonitor ntpd: precision = 10.000 usec
vmonitor ntpd: precision = 13.000 usec
vmonitor ntpd: precision = 18.000 usec