[PERL]- Extraire lignes d'un fichier à partir
Résolu
tonixm
Messages postés
127
Date d'inscription
Statut
Membre
Dernière intervention
-
tonixm Messages postés 127 Date d'inscription Statut Membre Dernière intervention -
tonixm Messages postés 127 Date d'inscription Statut Membre Dernière intervention -
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!!
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:
- [PERL]- Extraire lignes d'un fichier à partir
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Creer un groupe whatsapp a partir d'un autre groupe - Guide
- Fichier rar - Guide
36 réponses
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.
et donc ton script ne choisi que ceux qui possèdent ntpd et pas les autres.
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??
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??
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
:))
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
:))
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 .
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 .
o fait petit probleme:
le script etait :grep {s/.*(vmonitor\s*ntpd)\[.*\](:.*)/${1}$2/} @log;
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]"?
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]"?
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é
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é
Ben justemement cette partie (voir en gras) traite n'importe quoi, y compris les chiffres
106485010510997108
ntpd)\[.*\](:.*)/--
106485010510997108
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
grep {s/.*(vmonitor\s*ntpd)\[.*\](:.*)/${1}$2/} @log;
car cette fois ci on a plus vmonitor only mais par exemple zulu ou chateau
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)
Le script
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