[PERL]- Extraire lignes d'un fichier à partir

Résolu/Fermé
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 - 9 avril 2008 à 11:54
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 - 17 avril 2008 à 16:41
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!!
A voir également:

36 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
9 avril 2008 à 22:13
Si jamais ça ne marchera pas comme tu voudras ça veut dire que j'ai mal compris ce que tu veux ;-)
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
10 avril 2008 à 08:22
je te tiendrais au courant d'ici 2h
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
10 avril 2008 à 09:18
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.
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
10 avril 2008 à 10:01
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??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
10 avril 2008 à 10:29
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



:))
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
10 avril 2008 à 10:32
par contre comment éviter les doublons? cad deux même lignes?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
10 avril 2008 à 11:21
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 .


0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
10 avril 2008 à 11:36
ha oui j'ai vu
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
15 avril 2008 à 14:41
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]"?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
15 avril 2008 à 15:04
comment faire pour generaliser et enlever ces fichus "[chiffres]"?

tu parles de quelles chiffres
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
15 avril 2008 à 15:21
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é
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
15 avril 2008 à 15:23
Ben justemement cette partie (voir en gras) traite n'importe quoi, y compris les chiffres
ntpd)\[.*\](:.*)/
--
106485010510997108
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
15 avril 2008 à 15:25
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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
15 avril 2008 à 15:42
alors essaie
grep {s/.*(\w+\s*ntpd)\[.*\](:.*)/${1}$2/} @log; 
--
106485010510997108
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
17 avril 2008 à 16:41
merci
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
9 avril 2008 à 21:08
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

-1