Recherche occurrence dans fichier

Résolu
aurelazy Messages postés 197 Statut Membre -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    en shell ou en PHP ?
    0
  2. aurelazy Messages postés 197 Statut Membre 50
     
    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
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    $ 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
  4. aurelazy Messages postés 197 Statut Membre 50
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. aurelazy Messages postés 197 Statut Membre 50
     
    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
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      modifier
      po="${PO/ /|}"

      par
      po="${PO// /|}"
      0
  8. aurelazy Messages postés 197 Statut Membre 50
     
    Bonjour dubcek,
    Cela ne fonctionne pas.
    A quoi correspond po="${PO// /|}" ?

    Merci toi ;-)

    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      remplacer les espaces dans la variabe par des | pour que awk cherche port3 OU port5 OU etc
      montre un exemple de données
      0
  9. aurelazy Messages postés 197 Statut Membre 50
     
    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
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  11. aurelazy Messages postés 197 Statut Membre 50
     
    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
  12. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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