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 -
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.
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
-
hello
en shell ou en PHP ? -
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,
-
$ 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>, ... -
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. -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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,
-
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> -
Bonjour dubcek,
Cela ne fonctionne pas.
A quoi correspond po="${PO// /|}" ?
Merci toi ;-)
-
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 !!
-
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 -
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,
-
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)