IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Utilisation de sed pour un débutant


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 268
    Par défaut Utilisation de sed pour un débutant
    Bonjour,

    Tout d'abord, désolé de vous embêter, je ne suis vraiment pas bon en script.

    Voici mon problème :

    J'ai un fichier qui s'appelle ipdure.txt avec les données suivante :

    lease 172.17.111.169 {
    	starts 3 2015/11/04 13:44:14 UTC;
    	ends 4 2015/11/05 01:44:14 UTC;
    	hardware ethernet 00:08:5d:44:63:ad;
    	uid 01:00:08:5d:44:63:ad;
    	client-hostname "6867i00085D4463AD";
    }
    lease 172.17.114.1 {
    	starts 2 2015/10/06 13:07:13 UTC;
    	ends 3 2015/10/07 01:07:13 UTC;
    	hardware ethernet 00:08:5d:44:d8:8e;
    	uid 01:00:08:5d:44:d8:8e;
    	client-hostname "6867i00085D44D88E";
    }
    lease 172.17.113.1 {
    	starts 1 2015/10/19 13:31:00 UTC;
    	ends 2 2015/10/20 01:31:00 UTC;
    	hardware ethernet 00:08:5d:44:d8:91;
    	uid 01:00:08:5d:44:d8:91;
    	client-hostname "6867i00085D44D891";
    }
    Ce que je souhaite c'est de savoir pour telle plage IP quelle est le nombre d'IP restant à l'instant X.

    Ce que je comptais faire c'est de garder les IPs et la date de fin de réservation, puis comparer pour chaque ligne la date de fin et la date actuelle, si celle-ci est dépassé alors je la supprime, sinon je la garde et s'il y a un doublon d'IP je garde le plus récent.


    Donc j'ai commencé avec la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    more dhcpd.leases | egrep -e "lease|ends" >ipdure.txt
    ce qui me donne les données dans le format suivant :

    lease 172.17.111.169 {
    	ends 4 2015/11/05 01:44:14 UTC;
    lease 172.17.114.1 {
    	ends 3 2015/10/07 01:07:13 UTC;
    lease 172.17.113.1 {
    	ends 2 2015/10/20 01:31:00 UTC;
    Et la je suis bloqué, je n'arrive pas à dire que pour chaque ligne finissant par le caractère { alors tu supprimes le retour à la ligne (\n), je pensais que la commande suivante fonctionnerais, mais vu que ça ne fonctionne pas je pense ne pas avoir compris encore le fonctionnement des regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/\{^$/\n/d' ipdure.txt
    Alors plusieurs questions :

    1) Peut-être que je m'y prends mal, si vous avez une meilleur idée pour le faire je suis preneur
    2) Connaissez-vous un bon site pour apprendre les regex?
    3) Si vous voyez mon erreur pour le saut de ligne je suis aussi preneur

    Voila, encore désolé de mon amateurisme dans les regex :s

  2. #2
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 268
    Par défaut
    Bon bah pourquoi réinventer la roue quand au fin fond d'un site on trouve quelqu'un qui a déjà fait un script qui va pouvoir m'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #!/usr/bin/perl
     
    my $VERSION=0.03;
     
    my $leases_file = "/home/laurent/Desktop/Test_DHCP/dhcpd.leases";
     
    use strict;
    use Date::Parse;
     
    my $now = time;
    my %seen;       # leases file has dupes (because logging failover stuff?). This hash will get rid of them.
     
     
    open(L, $leases_file) or die "Cant open $leases_file : $!\n";
    undef $/;
    my @records = split /^lease\s+([\d\.]+)\s*\{/m, <L>;
    shift @records; # remove stuff before first "lease" block
     
    ## process 2 array elements at a time: ip and data
    foreach my $i (0 .. $#records) {
        next if $i % 2;
        my ($ip, $_) = @records[$i, $i+1];
     
        s/^\n+//;     # && warn "leading spaces removed\n";
        s/[\s\}]+$//; # && warn "trailing junk removed\n";
     
        my ($s) = /^\s* starts \s+ \d+ \s+ (.*?);/xm;
        my ($e) = /^\s* ends   \s+ \d+ \s+ (.*?);/xm;
     
        my $start = str2time($s);
        my $end   = str2time($e);
     
        my %h; # to hold values we want
     
        foreach my $rx ('binding', 'hardware', 'client-hostname') {
            my ($val) = /^\s*$rx.*?(\S+);/sm;
            $h{$rx} = $val;
        }
     
        my $formatted_output;
     
        if ($end && $end < $now) {
            $formatted_output =
                sprintf "%-15s : %-26s "              . "%19s "         . "%9s "     . "%24s    "              . "%24s\n",
                        $ip,     $h{'client-hostname'}, ""              , $h{binding}, "expired"               , scalar(localtime $end);
        }
        else {
            $formatted_output =
                sprintf "%-15s : %-26s "              . "%19s "         . "%9s "     . "%24s -- "              . "%24s\n",
                        $ip,     $h{'client-hostname'}, "($h{hardware})", $h{binding}, scalar(localtime $start), scalar(localtime $end);
        }
     
        next if $seen{$formatted_output};
        $seen{$formatted_output}++;
        print $formatted_output;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Shell][sed]utilisation d'un sed pour gérer des doubles quotes
    Par bstevy dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 06/03/2015, 11h03
  2. Utilisation des triggers pour un update (niveau débutant)
    Par bipbip2006 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/11/2010, 09h16
  3. [débutant] Utiliser un slot pour griser un bouton
    Par azerty_essai dans le forum Qt
    Réponses: 3
    Dernier message: 23/03/2009, 15h51
  4. utilisation de SED pour ajouter une chaine de caractère en début de texte
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 11/03/2008, 09h12
  5. [JSTL] [débutant] Utilisation de jstl pour une internationnalisation
    Par mimil77210 dans le forum Taglibs
    Réponses: 7
    Dernier message: 16/02/2007, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo