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 -
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.
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:
- Recherche occurrence dans fichier
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
11 réponses
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,
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:
le résultat est :
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.
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,
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>
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":
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 !!
=> 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,
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)