Exraire les donnes d'un fichier

Résolu
othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention   -  
othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
comment je peux extraire que les adresse MAC ayant free comme state, je sais que je doit passer par des grep et cut et tr,mais je vois pas trop comment faire
si vous avez une idéé sur comment faire
merci d'avance de votre aide

voila l'xemple du fichier:
lease 192.168.100.2 {
starts 1 2012/04/02 09:54:36;
ends 1 2012/04/02 09:55:48;
tstp 1 2012/04/02 09:55:48;
cltt 1 2012/04/02 09:54:36;
binding state free;
hardware ethernet 00:14:22:c3:38:53;
uid "\001\000\024\"\3038S";
}
lease 192.168.100.14 {
starts 3 2012/04/04 14:35:26;
ends 3 2012/04/04 14:36:38;
cltt 3 2012/04/04 14:35:26;
binding state active;
next binding state free;
hardware ethernet 00:20:d2:2b:f6:1a;
}
lease 192.168.100.14 {
starts 3 2012/04/04 14:36:02;
ends 3 2012/04/04 14:37:14;
cltt 3 2012/04/04 14:36:02;
binding state active;
next binding state free;
hardware ethernet 00:20:d2:2b:f6:1a;
}

39 réponses

  • 1
  • 2
Résumé de la discussion

La problématique consiste à extraire les adresses MAC correspondant à l'état 'binding state free' à partir d'un fichier de bail DHCP, en utilisant des outils de ligne de commande. Plusieurs solutions sont discutées, notamment l'usage d'awk et de sed pour isoler le bloc 'binding state free' puis récupérer 'hardware ethernet', et des méthodes supplémentaires basées sur des commandes comme grep et cut. Des exemples de propositions, sed et awk, permettent d’isoler chaque bloc binding state free puis d’extraire l’adresse MAC située après hardware ethernet et des échanges techniques permettent de discuter leur efficacité. Des échanges portent aussi sur la redirection du résultat vers un fichier externe et sur l’adaptation des commandes au format exact du fichier log utilisé localement.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    $ awk -F"[ ;]" '/state free/{getline;print $3}' fichier  
    00:14:22:c3:38:53  
    00:20:d2:2b:f6:1a  
    00:20:d2:2b:f6:1a  
    $ 
    ou
    $ awk -F"[ ;]" '/^binding state free/{getline;print $3}' fichier 
    00:14:22:c3:38:53 
    $  
    
    0
  2. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    salut
    merci pour ta reponse
    reste un souci c'est que la commande m'affiche tous les adresses MAC c'est parceque il prend en consideration la ligne next binding stat , aussi alors que moi je voulais qui il regarde que binding state
    merci pour ton aide
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      c'est ce que fait la deuxième commande
      0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Voici une solution que je te propose de mettre dans un fichier par exemple script.awk :

    #/usr/bin/env awk
    
    function trim(v) { 
        gsub(/^[ \t]+/, "", v);
        gsub(/[ \t]+$/, "", v);
        return v;
    }
    
    function extract(key, line) {
        v = trim(line);
        sub(key, "", v);
        sub(";", "", v);
        v = trim(v);
        return v;
    }
    
    /{/ {
        binding_state = hardware_address = "";
    }
    
    /^[ \t]*binding state/ {
        binding_state = extract("binding state", $0);
    }  
       
    /^[ \t]*hardware ethernet/ {
        hardware_address = extract("hardware ethernet", $0);
    }       
         
    /}/ {    
        if (binding_state == "active") print hardware_address;
    } 


    Ensuite, pour parser toto.txt :

    awk -f script.awk toto.txt


    ... ce qui donne avec le fichier toto.txt :

    lease 192.168.100.2 { 
    starts 1 2012/04/02 09:54:36; 
    ends 1 2012/04/02 09:55:48; 
    tstp 1 2012/04/02 09:55:48; 
    cltt 1 2012/04/02 09:54:36; 
    binding state free; 
    hardware ethernet 00:14:22:c3:38:53; 
    uid "\001\000\024\"\3038S"; 
    } 
    lease 192.168.100.14 { 
    starts 3 2012/04/04 14:35:26; 
    ends 3 2012/04/04 14:36:38; 
    cltt 3 2012/04/04 14:35:26; 
    binding state active; 
    next binding state free; 
    hardware ethernet 00:20:d2:2b:f6:1a; 
    } 
    lease 192.168.100.14 { 
    starts 3 2012/04/04 14:36:02; 
    ends 3 2012/04/04 14:37:14; 
    cltt 3 2012/04/04 14:36:02; 
    binding state active; 
    next binding state free; 
    hardware ethernet 00:20:d2:2b:f6:1a; 
    } 


    ...le résultat suivant :

    (mando@aldur) (~) $ awk -f toto.awk toto.txt 
    00:20:d2:2b:f6:1a
    00:20:d2:2b:f6:1a


    Bonne chance
    0
  4. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    merci bien pour ta reponse
    j'aurai aimé avoir une solution plus simple genre passer par la commande sed,
    j'assaie de creuser la dessus tu pense pas q'il aurait d'autre solution plus simple en passant par sed ou autre
    et merci d'avance
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      La solution de dubcek ici même ou la mienne dans ton autre post devrait faire l'affaire, mais il nous faut un exemple plus précis de ton fichier ;-(
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    meme ce script il marche pas correctement qu'on j'ajoute une MAC avec un state free il l'affiche pas
    merci d'avance de votre reponse
    0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Eh bien il suffit de corriger le test pour qu'il affiche aussi les free :

     if (binding_state == "active") print hardware_address;


    qui devient du coup :

     if (binding_state == "active" || binding_state == "free") print hardware_address;


    Bonne chance
    0
  8. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,
    je voulais afficher que les lignes dont leur time est supérieur a un time donné

    voila le fichier:
    Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+09.31.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+19.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+09.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+07.45.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1

    quand j'essaie avec cette commande:
    awk -F'+' ' $4 > 10 { print }' tg

    j'ai cette affichage ce qui est bien
    Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1

    mais quand j'essaie d'afficher les ligne avec un time supérieur a 7.00(par exemple)

    awk -F'+' ' $4 > 7.00 { print }' tg

    il affiche rien.
    je voulais savoir c'est quoi le problème.
    merci d'avance de votre aide et de votre compréhension
    0
  9. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    salut,
    ok je vois merci beaucoup.
    mais la je suis un peu déçu la par ce que je voulais utiliser cette commande dans un script perl ca fait un moment que je cherche est ce qui parait que perl ne support pas AWK aurez vous une idée comment résoudre ce probleme
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ce que fait awk, perl peut le faire ;-)
      0
    2. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
       
      vue que j'ai jamais utilisé perl je vois pas trop comment faire je viens de voir la commande split mais comparer le champ je sais pas comment le faire
      j'espère que vous aurez un idé concernant la commande
      merci d'avance
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      $ perl -e '$x=$ARGV[0] ; $x =~s/(^[\d]+\.[\d]+).*$/\1/ ; print $x, "\n"' 11.22.33
      11.22
      $ 
      $ perl -e '$x=$ARGV[0] ; $x =~s/(^[\d]+\.[\d]+).*$/\1/ ; print $x, "\n"' 07.45.33
      07.45
      $ 
      0
  10. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    salut
    merci pour ta reponse je vois que ca fait pas le meme effet que AWk(afficher les ligne d'un fichier s'il sont sup a un time donné
    j'ai pas trop compris comment tester ca?
    merci d'avance
    0
  11. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    tu vois pas un moyen pour intégrer cette commande sur le scipt perl?
    awk -F'+' ' strtonum($4) > 10 { print }' tg
    merci d'avance.
    0
  12. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    j'attends toujours une réponse de votre part
    merci d'avance
    0
  13. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    regarde a2p
    NAME 
           a2p - Awk to Perl translator 
    SYNOPSIS 
           a2p [options] [filename] 
    DESCRIPTION 
           A2p takes an awk script specified on the command line (or from standard input) and produces a comparable perl script on the standard output. 
    ...
    0
  14. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    sa ce voit que l'utilisation de cette commande sera pas evident
    merci d'avance
    0
  15. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    j pense pas que ca va marcher vu que je voulais pas utiliser un script AWk
    ce que je cherche c'est d'utiliser un script perl dans le kel j'integre la commande
    merci d'avance
    0
  16. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    $ perl -ne '($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 10){print $_};' < tg
    Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    $ 
    $ perl -ne '($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 7){print $_};' < tg
    Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+09.31.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+19.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+09.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+07.45.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    $ 
    0
  17. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    merci beaucoup je pense que la commande fait bien son rôle
    reste un petit truc, c'est que je cherche a l'exécuter sur un fichier perl et orienter son affichage vers un autre fichier
    ce serait sympa de m'aider sur ce dernier petit point

    et merci d'avance
    0
  18. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    pour rediriger la sortie ajouter > fichier
    si c'est dans un script, l'exécuter avec perl prog.pl
    0
  19. othmane19 Messages postés 96 Date d'inscription   Statut Membre Dernière intervention  
     
    cette ligne ne s'execute pas dans un script perl

    perl -ne '($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 7){print $_};' < tg

    merci d'avance
    0
  20. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    bin non, il ne faut que le code perl, mais il faut rajouter une boucle, boucle que fait implicitement l'option -n ou -p
    $ perl p1  < tg
    Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
    $ 
    $ cat p1
    while (<>) {
    	($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 10){print $_}
    }
    0
  • 1
  • 2