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

Résolu
Précédent
  • 1
  • 2
  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Si jamais ça ne marchera pas comme tu voudras ça veut dire que j'ai mal compris ce que tu veux ;-)
    0
  2. tonixm Messages postés 127 Statut Membre 4
     
    je te tiendrais au courant d'ici 2h
    0
  3. tonixm Messages postés 127 Statut Membre 4
     
    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
  4. tonixm Messages postés 127 Statut Membre 4
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tonixm Messages postés 127 Statut Membre 4
     
    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
  7. tonixm Messages postés 127 Statut Membre 4
     
    par contre comment éviter les doublons? cad deux même lignes?
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  9. tonixm Messages postés 127 Statut Membre 4
     
    ha oui j'ai vu
    0
  10. tonixm Messages postés 127 Statut Membre 4
     
    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
  11. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    comment faire pour generaliser et enlever ces fichus "[chiffres]"?

    tu parles de quelles chiffres
    0
  12. tonixm Messages postés 127 Statut Membre 4
     
    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
  13. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Ben justemement cette partie (voir en gras) traite n'importe quoi, y compris les chiffres
    ntpd)\[.*\](:.*)/
    --
    106485010510997108
    0
  14. tonixm Messages postés 127 Statut Membre 4
     
    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
  15. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    alors essaie
    grep {s/.*(\w+\s*ntpd)\[.*\](:.*)/${1}$2/} @log; 
    --
    106485010510997108
    0
  16. tonixm Messages postés 127 Statut Membre 4
     
    merci
    0
  17. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
Précédent
  • 1
  • 2