Recherche occurrence dans fichier

Résolu
aurelazy Messages postés 190 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18789 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.
A voir également:

11 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
en shell ou en PHP ?
0
aurelazy Messages postés 190 Date d'inscription   Statut Membre Dernière intervention   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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
$ 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
aurelazy Messages postés 190 Date d'inscription   Statut Membre Dernière intervention   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

Vous n’avez pas trouvé la réponse que vous recherchez ?

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

par
po="${PO// /|}"
0
aurelazy Messages postés 190 Date d'inscription   Statut Membre Dernière intervention   50
 
Bonjour dubcek,
Cela ne fonctionne pas.
A quoi correspond po="${PO// /|}" ?

Merci toi ;-)

0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
remplacer les espaces dans la variabe par des | pour que awk cherche port3 OU port5 OU etc
montre un exemple de données
0
aurelazy Messages postés 190 Date d'inscription   Statut Membre Dernière intervention   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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
aurelazy Messages postés 190 Date d'inscription   Statut Membre Dernière intervention   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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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