Recherche occurrence dans fichier

Résolu
Bonjour à tous,

Je bloque depuis quelques jours sur un script, voici ce que je voudrais:

Je dois récupérer depuis un commutateur le nom du VLAN de chaque port ouvert (up administrativement), commande sur switch = "show vlan sort-by tag", que je récupère dans un fichier => "fichier_TAG_<IPduSWITCH>"

Les ports ouvert sont dans une variable, on va dire "PortOuvert",

Mon fichier ressemble à ça:
<nom VLAN1> <n° TAG>
<port1>, <port3>, <port4>, etc...
<nom VLAN2> <n° TAG>
<port2>, <port5>, ...
....

Donc j'aimerais récupérer le nom du VLAN et le N° de TAG, par rapport à mes ports ouvert que j'ai dans la variable "$PortOuvert"

J'ai essayé avec grep, if ... sans succés, en faisant "for elem in $PortOuvert"; ...

Si quelqu'un connait une astuce, je vous remercie d'avance.

Bonne journée, et bon appétit.

--
Well, if it looks like a duck, swims like a duck, and quacks like a duck, it's probably a duck.

11 réponses

  1. Bonjour dubcek,

    en Shell de préférence, voir python, mais j'ai déjà commencé un script bash qui utilise "expect" pour récupérer les valeurs directement du switch.

    Merci,
    0
    1. $ PortOuvert=VLAN1
      $ awk -F "[<>]" -v p="$PortOuvert" '$0 ~ p {printf $4 OFS; getline; print; exit}' fichier
      n° TAG <port1>, <port3>, <port4>, etc...
      $ PortOuvert=VLAN2
      $ awk -F "[<>]" -v p="$PortOuvert" '$0 ~ p {printf $4 OFS; getline; print; exit}' fichier
      n° TAG <port2>, <port5>, ...
      0
      1. Merci pour ta réponse dubcek,

        Mais en fait c'est le contraire dont j'ai besoin ;-)

        j'ai tous mes ports dans $PortOuvert (=> ge-0/0/15, ge-0/0/35, ...)
        et je voudrais récupérer le nom du VLAN et le TAG pour chacun de ces ports

        J'ai trouvé quelque chose mais je n'arrive pas à avoir le rendu que je veux:

        for elem in $PortOuvert
        do
            ligne=`grep -n "$elem" fichier_VLAN | cut -d: -f1`
            ligne=$(($ligne-1))
            head -$ligne < fichier_VLAN | tail -1 | awk -v VAR="$elem" '{ print $1";"$2";"$VAR }'
        done
        


        le résultat est :

        <nom_VLAN>;<n° TAG>;<nom_VLAN> <n° TAG>


        Alors que je veux le n° de port (ge-0/0/x) à la place de mon "$VAR"

        Je ne comprends pas pourquoi $VAR ne contient pas $elem !!

        Merci d'avance,

        Well, if it looks like a duck, swims like a duck, and quacks like a duck, it's probably a duck.
        0
        1. Cool, j'ai trouvé !! Au lieu de $VAR il faut utiliser VAR tout court ;-)
          Merci à toi dubcek pour ton aide

          Si vous avez d'autres idées plus courtes et plus simple merci de me tenir au courant ;-)

          Bonne journée à tous,

          0
          1. comme ca ?
            $ PO="port3 port5"; awk -v po="${PO/ /|}" '/nom/ {lan=$0} $0 ~ po { print lan}' fichier
            <nom VLAN1> <n° TAG>
            <nom VLAN2> <n° TAG>
            0
            1. modifier
              po="${PO/ /|}"

              par
              po="${PO// /|}"
              0
          2. Bonjour dubcek,
            Cela ne fonctionne pas.
            A quoi correspond po="${PO// /|}" ?

            Merci toi ;-)

            0
            1. remplacer les espaces dans la variabe par des | pour que awk cherche port3 OU port5 OU etc
              montre un exemple de données
              0
          3. echo $ports
            => ge-0/0/0 ge-0/0/9 ge-0/0/2 ge-0/0/4

            voila pour la variable avec mes ports,

            mon fichier (tiré d'un routeur Juniper, avec un "show vlans sort-by tag":


            SUP 100
            ge-0/0/23.0, ge-0/0/3.0, ge-0/0/15.0
            VLAN1 510
            ge-0/0/1.0, ge-0/0/4.0*, ge-0/0/25.0
            VLAN2 512
            ge-0/0/0.0*, ge-0/0/2.0*
            VLAN3 513
            ge-0/0/9.0*, ge-0/0/8.0


            Le retour doit être:

            ge-0/0/0,VLAN2,512
            ge-0/0/9,VLAN3,513
            ge-0/0/2,VLAN2,512
            ge-0/0/4,VLAN1,510

            Voila j'espère que c'est plus compréhensible ;-)
            Et encore merci à toi !!

            0
            1. p=a[l] "[.]"
              j'ajoute un point au port à chercher parce que ge-0/0/2 est contenu dans ge-0/0/23.0
              $ PO="ge-0/0/0 ge-0/0/9 ge-0/0/2 ge-0/0/4"
              $ awk -v po="$PO" 'BEGIN {n=split(po, a); s=","} /^[A-Z]/ {v=$1; t=$2; next} {for(l=1; l<=n; l++){p=a[l] "[.]"; if($0 ~ p)print a[l] s v s t}}' fichier
              ge-0/0/4,VLAN1,510
              ge-0/0/0,VLAN2,512
              ge-0/0/2,VLAN2,512
              ge-0/0/9,VLAN3,513
              0
              1. Salut dubcek,
                Ca fonctionne super bien ;-)
                Par contre, je ne comprends pas tout, ça va me permettre de bosser un peu mon AWK.

                Merci beaucoup
                Bonne nuit,

                0
                1. détails:
                  BEGIN {n=split(po, a); s=","}        on remplit un tableau a avec chaque port à chercher dans la variable po qui contient PO, n est le nombre de ports
                  /^[A-Z]/ {v=$1; t=$2; next} pour chaque ligne qui commence par une maj, on sauve v=vlan, champ 1, t = tag, champ 2
                  for(l=1; l<=n; l++){p=a[l] "[.]" pour chaque port dans le tableau a on ajoute un point
                  if($0 ~ p)print a[l] s v s t} si la ligne contient ce port, on affiche : port, vlan, tag (s=virgule)
                  0