Forum Programmation.shell retrouver la vraie IP avec AWK ou autres

Posté par  .
Étiquettes : aucune
0
3
oct.
2007
Bonjour,

je suis un debutant en shell.
Dans un fichier qui contient plusieurs bloc define , comme un fichier nagios par exemple , je veux recuperer un bloc bien precis en ne sachant que l'IP ( j'ai mes raisons :) ). J'ai donc cherche sur la toile et j'ai trouve du code interessant. Apres quelques modifs et tests , j'ai ca comme code.
awk 'BEGIN{RS="}"} /define/ && /mon_IP/ { print $0 "}" }' mon_fichier

Mais voila , y a juste un truc qui m'ennui beaucoup.

Si je cherche une ip du genre xxx.xxx.xxx.5 , il va me donner tout les bloc correspondant aux iPs xxx.xxx.xxx.5 , xxx.xxx.xxx.50 , xxx.xxx.xxx.51 , xxx.xxx.xxx.52 , etc ....

Comment puis je faire pour qui ne me cherche que l'IP que je desire et seulement celle la?

Merci d'avance.
  • # Exemple du fichier d'entrée

    Posté par  . Évalué à 2.

    Aurais-tu un exemple de ton fichier d'entrée ??

    Si celui-ci ne contient que des IP et que tu souhaites récupérer tout ce qui se termine en .5 alors il faut faire ça :

    cat tonfichier |awk -F"." '{ if ($4 == 5) print $0}'

    Sinon, merci de nous donner un exemple du fichier d'entrée
    • [^] # Re: Exemple du fichier d'entrée

      Posté par  . Évalué à 1.

      deja Merci de votre aide.
      Voici un exemple de fichier. j'ai mis des IP locale , mais je travaille sur des IP global. Et ici j'ai mis que 3 define host , mais dans un meme fichier en principe , j'en ai plusieurs dizaines , voir plus.
      Et donc je recherche a recuperer le define host qui correspond a 192.168.0.5 (dans cet exemple) sans me payer les autres. Et biensur je ne veux pas utiliser d'Autres arguments que l'IP

      #cat mon_fichier.cfg

      define host{
      host_name db.masociete.com
      alias db.masociete
      address 192.168.0.5
      use generic-host
      contact_groups mail-report
      parents switch-S50
      }

      define host{
      host_name ns.masociete.com
      alias ns.masociete.com
      address 192.168.0.55
      use generic-host
      contact_groups mail-report
      parents switch-S50
      }

      define host{
      host_name db2.masociete.com
      alias db.masociete
      address 192.168.0.52
      use generic-host
      contact_groups mail-report
      parents switch-S50
      }

      define hostgroup{
      hostgroup_name switch-S5_host
      alias switch-S5_host
      members db.masociete.com,ns.masociete.com,db2.masociete.com
      }
      • [^] # Re: Exemple du fichier d'entrée

        Posté par  . Évalué à 1.

        Donc si je fais
        awk 'BEGIN{RS="}"} /define/ && /'192.168.0.5'/ { print $0 "}" }' mon_fichier.cfg
        Et bien je recupere les 3 blocs dont les address sont 192.168.0.5 , 192.168.0.55 et 192.168.0.52.
        • [^] # Re: Exemple du fichier d'entrée

          Posté par  . Évalué à 2.

          C'est parce que ton expression régulière est incomplète. Essaie à la place d'utiliser la commande que je t'ai indiqué dans mon commentaire ci-dessous. A défaut, si tu tiens à utiliser awk, reprends l'expression que j'ai écrite en gras.
  • # Je propose :

    Posté par  . Évalué à 2.

    sed -n -e '/{/,/}/ H; /{/,/}/ ! { x; /192\.168\.0\.5\([^0-9]\+.*\)*$/ p; x; h; }'

    En considérant bien sûr qu'il n'y a pas de zéro non-significatif à gauche de chaque nombre ...
    • [^] # Re: Je propose :

      Posté par  . Évalué à 1.

      Ou en awk, que je préfère personellement:


      awk 'BEGIN{RS="}"} /define/ && /192.168.0.5[^0-9]/ { print $0 "}" }' mon_fichier
      • [^] # Re: Je propose :

        Posté par  . Évalué à 1.

        Bravossimo , ca marche

        Merci beaucoup. Vous m'enlevez tous une grosse epine du pied , comme on dit.
        awk 'BEGIN{RS="}"} /define/ && /192.168.0.5[^0-9]/ { print $0 "}" }' mon_fichier =====> ca marche

        awk 'BEGIN{RS="}"} /define/ && /192.168.0.5\n]/ { print $0 "}" }' mon_fichier =====> marche aussi

        Quand a SED , je vais essayer plus tard .

        Merci a TOUS .
      • [^] # Re: Je propose :

        Posté par  . Évalué à 3.

        Ou plus simplement
        awk 'BEGIN{RS="}"} /define/ && /192.168.0.5\>/ { print $0 "}" }' mon_fichier

        le \> correspond à "fin de mot"
  • # je tente :

    Posté par  . Évalué à 1.

    awk 'BEGIN{RS="}"} /define/ && /192.168.0.5\n/ { print $0 "}" }'
    • [^] # Re: je tente :

      Posté par  . Évalué à 2.

      euh .... il me semble que dans les expressions régulieres, fin de ligne est caractérisé par $ et non \n.
      • [^] # Re: je tente :

        Posté par  . Évalué à 1.

        je t'invite à tester chez toi avec les exemples donnés. Chez moi, ça ne passait pas avec le $ . Peut-etre parce qu'au début de son awk, il redéfini le séparateur d'enregistrement.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.