[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
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
A voir également:
- [PERL]- Extraire lignes d'un fichier à partir
- Fichier rar - Guide
- Fichier host - Guide
- Fichier iso - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
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
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 ;-)
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
10 avril 2008 à 08:22
je te tiendrais au courant d'ici 2h
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
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.
et donc ton script ne choisi que ceux qui possèdent ntpd et pas les autres.
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
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??
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
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
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
:))
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
:))
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
10 avril 2008 à 10:32
par contre comment éviter les doublons? cad deux même lignes?
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
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 .
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 .
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
10 avril 2008 à 11:36
ha oui j'ai vu
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
15 avril 2008 à 14:41
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]"?
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
15 avril 2008 à 15:04
comment faire pour generaliser et enlever ces fichus "[chiffres]"?
tu parles de quelles chiffres
tu parles de quelles chiffres
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
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é
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é
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
15 avril 2008 à 15:23
Ben justemement cette partie (voir en gras) traite n'importe quoi, y compris les chiffres
106485010510997108
ntpd)\[.*\](:.*)/--
106485010510997108
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
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
grep {s/.*(vmonitor\s*ntpd)\[.*\](:.*)/${1}$2/} @log;
car cette fois ci on a plus vmonitor only mais par exemple zulu ou chateau
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
15 avril 2008 à 15:42
alors essaie
106485010510997108
grep {s/.*(\w+\s*ntpd)\[.*\](:.*)/${1}$2/} @log;--
106485010510997108
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
17 avril 2008 à 16:41
merci
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
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)
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