Recherche occurrence dans fichier

Résolu/Fermé
aurelazy Messages postés 190 Date d'inscription vendredi 21 février 2014 Statut Membre Dernière intervention 30 janvier 2015 - 4 déc. 2014 à 12:23
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 - 5 déc. 2014 à 16:30
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 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
4 déc. 2014 à 12:29
hello
en shell ou en PHP ?
0
aurelazy Messages postés 190 Date d'inscription vendredi 21 février 2014 Statut Membre Dernière intervention 30 janvier 2015 50
4 déc. 2014 à 13:21
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 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
4 déc. 2014 à 14:48
$ 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 vendredi 21 février 2014 Statut Membre Dernière intervention 30 janvier 2015 50
Modifié par aurelazy le 4/12/2014 à 14:58
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 vendredi 21 février 2014 Statut Membre Dernière intervention 30 janvier 2015 50
4 déc. 2014 à 15:03
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 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
4 déc. 2014 à 15:26
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 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
5 déc. 2014 à 08:07
modifier
po="${PO/ /|}"

par
po="${PO// /|}"
0
aurelazy Messages postés 190 Date d'inscription vendredi 21 février 2014 Statut Membre Dernière intervention 30 janvier 2015 50
5 déc. 2014 à 09:12
Bonjour dubcek,
Cela ne fonctionne pas.
A quoi correspond po="${PO// /|}" ?

Merci toi ;-)

0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
5 déc. 2014 à 10:44
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 vendredi 21 février 2014 Statut Membre Dernière intervention 30 janvier 2015 50
5 déc. 2014 à 11:10
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 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
Modifié par dubcek le 5/12/2014 à 12:19
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 vendredi 21 février 2014 Statut Membre Dernière intervention 30 janvier 2015 50
5 déc. 2014 à 15:03
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 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
5 déc. 2014 à 16:30
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