Associer des champs à une variable texte [AWK] - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 13-04-2011 à 12:37:51
Citation : Bonjour à tous, |
Sinon tu pourrais mettre un exemple de ton fichier source que tu veux parcourir ligne par ligne ainsi que la structure de ta table sql.
Marsh Posté le 13-04-2011 à 13:54:50
roondar a écrit :
Sinon tu pourrais mettre un exemple de ton fichier source que tu veux parcourir ligne par ligne ainsi que la structure de ta table sql. |
Si ça peut aider why not!
Le "fichier" source est un ensemble de fichiers dans un dossier, parcouru avec un for. La structure de la BDD est simple, un "champ" pour chaque champ désiré (donc chaque entre |), les fichiers sources ressemblent à ça (plusieurs dizaines de lignes comme ça):
Citation : 4227809|GigabitEthernet1/0/24|gigabitEthernet|1522|0|0:1e:c1:c6:f8:d8|down|down|99:0:16:10.55|403635924|3801068358|38997521|23003|34312273|0|2713656531|4227154371|766850125|0|0|0|SNMPv2-SMI::zeroDotZero |
Celui-ci est transformé comme j'ai montré le post précédent par ma commande awk, nickel, sauf que j'aimerais stocker chaque ligne affichée qque part now, la division me va bien en fait. Sauf que plutôt qu'un print $1 je veux un variable=$1
pour ton aide
EDIT: j'ai tenté ça là, autrement pr éviter AWK que je connais peu
Citation : ## Extraction des donnees interface for i in $(seq 1 25) valeur_$i=$(echo $line|cut -f$i -d "|" ) done echo $valeur_1 $valeur_2 done < $fichier |
fichier correspond à un fichier interface, contenant donc plein de lignes comme celle citée plus haut, line à une ligne
EDIT2: d'ailleurs ça ne marche pas plus pr le moment, tjr un souci pr le stockage dans une variable, je vois bien la donnée mais il me met une erreur
Citation : ./interfaceSQL.sh: line 34: valeur_1=4227730: command not found |
Marsh Posté le 13-04-2011 à 17:52:49
Pour moi awk sert à rien ici, le script lit les fichiers sources (file*) et les insère directement dans la base de donnée.
Spoiler :
|
Code :
|
Marsh Posté le 13-04-2011 à 18:53:55
Je testerais demain mais ça a l'air pas mal effectivement
Je "connaissais" pas la technique
Citation : |while IFS=\| read champ1 champ2 ... |
Pas bête, finalement les commandes simples permettent de faire bcp de choses.
Faut que je vois ce que donne chaque commande pour bien comprendre. Je vois l'utilité du 'grep . file*' là.
Est-ce bien compatible avec le fait que je fais un traitement par fichier (j'extrais la date et le hostname du nom_du_fichier)? Ou ça les met tous à la suite ce qu'on semble voir dans ton exemple.
Au pire je passe par ma méthode au départ, car si l'extraction des champ est aussi simple que ta commande le laisse supposer c'est bon. Je m'emmerdais avec un cut dernièrement qui posait problème car je n'arrivais pas à le stocker dans une variable incrémentée.
Marsh Posté le 13-04-2011 à 19:04:50
le 'grep . file*' servait juste à te montrer le contenu de mes fichiers, il n'a rien à voir avec le script.
Vu que je ne savais pas que tu extrayais la date et le hostname jai fait une bête lecture de tous les fichiers.
Donc tu se serais plus çà :
Code :
|
Et sinon par rapport à ton script, ton erreur vient du faire que tu n'entourres pas tes variables par des guillemets et tu as oublier de mettre un "declare" (d'ailleurs on utilise des tableaux pour çà ^^).
Marsh Posté le 13-04-2011 à 19:28:21
J'ai testé avec les guillemets ça ne marchait pas non plus car il ne prenait pas la bonne valeur (mais plus d'erreur command machin), à moins d'une autre erreur
Ok ça me parait nickel merci beaucoup, je teste toussa demain
Marsh Posté le 14-04-2011 à 11:32:11
Sinon pour injecter une variable dans awk tu peut faire ça (pas testé) :
while read line |
Marsh Posté le 14-04-2011 à 12:27:20
Nickel ta solution roondar, ça marche parfaitemet, merci
@twocats, en fait je voulais faire l'inverse: mettre la sortie dans une variable
Marsh Posté le 14-04-2011 à 13:22:21
g-ridaz a écrit : Nickel ta solution roondar, ça marche parfaitemet, merci |
De rien
Marsh Posté le 18-04-2011 à 11:09:00
J'ai un nouveau souci je cherche à comparer deux chaines de caractères:
if ["$ID_VLAN2" != "$ID_VLAN"] malheureusement il me met que la commande n'existe pas
Citation : ID_VLAN2=$(sed -n 2p done/$name.*.vlan|cut -c44-|cut -f1 -d "=" ); echo ID_VLAN2=$ID_VLAN2 |
C'est surement très "moche" encore pour ce que je veux faire, mais j'ai pas vraiment l'xp du bash, du coup je fais comme je peux avec ce qui me vient en tête. J'optimiserais après si je découvre des fonctions/commandes utiles pour ce que je veux...
Marsh Posté le 18-04-2011 à 11:31:12
Les espaces :
if [ "$ID_VLAN2" != "$ID_VLAN" ] |
Et "Useless use of cat" again...
Marsh Posté le 18-04-2011 à 11:36:18
en fait j'en avais pas mis au départ mais yen a dans la variable, et donc ça doit foutre la merde au moment du remplacement
ouais un peu de mal avec le code done/.. suffit?? EDIT: Non mais j'imagine grep [] done/...
Marsh Posté le 18-04-2011 à 14:12:52
J'ai finalement supprimé les espaces pourtant ça ne marche tjr pas
Citation : ./test.sh: line 25: [37129!=65]: command not found |
EDIT: faut en rajouter
EDIT2:
Marsh Posté le 18-04-2011 à 21:12:15
Pour des nombres on utilise plutôt l'option "-ne" de test.
Code :
|
Marsh Posté le 18-04-2011 à 21:33:03
g-ridaz a écrit : ... |
Je comprends pas un truc : pourquoi isoler chaque ligne pour la traiter avec awk alors que le principe de awk est justement d'appliquer un traitement sur chaque ligne
Sinon, il me semble que awk reste bien plus pratique pour ce type de traitement, au lieu du shell qui va être bien plus compliqué dès qu'on veut manipuler un peu les données.
Perso, et si j'ai bien compris la question, je ferais quelque chose du genre :
awk -F\| ' |
Marsh Posté le 18-04-2011 à 23:10:18
mrbebert a écrit : Je comprends pas un truc : pourquoi isoler chaque ligne pour la traiter avec awk alors que le principe de awk est justement d'appliquer un traitement sur chaque ligne
|
Parce que je suis très mauvais , pas du tout programmeur (formation admin réseau au départ mais spa une excuse) et que je connais pas du tout awk.
Le petit souci pour moi c'est que je dois passer de fichiers en fichiers, que les infos doivent se recouper entre les fichiers, donc j'ai pensé à récup des élements entre les deux, et entre tout je m'y perd vachement. Je voudrais pas que HFR me fasse le prog à ma place car je trouve ça intéressant de galérer mais c'est vrai qu'un connaisseur fait ça en deux sec, et en 10 fois moins de lignes
Je repasserais peut etre expliquer exactement ce que je veux faire demain, en postant les deux fichiers que je dois lire, l'organisation de la BDD et comme ça je profiterais de votre aide précieuse
Marsh Posté le 18-04-2011 à 23:22:34
Je ne sais pas ce que tu veux dire exactement par "passer de fichiers en fichiers" mais une piste peut être de charger chaque fichier "brut" dans une table temporaire et de générer les données finales par des requêtes SQL. C'est tout de même beaucoup plus pratique que du shell quand on parle de sélections ou de jointures
Marsh Posté le 19-04-2011 à 08:28:34
mrbebert a écrit : Je ne sais pas ce que tu veux dire exactement par "passer de fichiers en fichiers" mais une piste peut être de charger chaque fichier "brut" dans une table temporaire et de générer les données finales par des requêtes SQL. C'est tout de même beaucoup plus pratique que du shell quand on parle de sélections ou de jointures |
En fait jai limpression qu'il ya tellement de maniere de faire que je my perd un peu
Cest une idee a laquelle je navais pas pense mais je pense pas que se soit bien possible. Jexpliquerais plus en detail plus tard dans la matinee. Je peux faire du perl aussi mais alors la je connais encore moins
Marsh Posté le 19-04-2011 à 12:31:18
Bon c'est parti!
J'ai donc 3 types de fichiers: .sys / .int / .vlan
.sys contient plusieurs informations sur le système, dont le type de switch (grâce à un OID qui permet d'identifier les différentes séries)
.int contient les informations sur les interfaces, ID_Int typiquement
.vlan les infos des vlans, sous la forme OID.ID_Vlan = Vlan Description et OID.ID_Vlan = VlanIfIndex, puis ifStackStatus qui permet de connaitre la correspondance entre Vlan et interfaces
Citation : SNMPv2-SMI::enterprises.43.10.1.14.1.2.1.2.65 = STRING: "Default VLAN" |
Objectifs
Je cherche donc à lister les vlan dans la BDD, puis d'y associer dans une table d'asso les interfaces sur lesquels chacun d'entre eux se retrouve.
Tables SQL
VLAN --
id_vlan | vlanIfIndex | vlanDescr
l_interface_vlan --
id_interface | vlanIfIndex
interface --
id_interface | id_host | ...
EDIT: ce que je fais marche btw (en tous cas pour une version de "l'IOS" )
Marsh Posté le 13-04-2011 à 11:17:20
Bonjour à tous,
j'écris un script bash pour remplir une BDD MySQL avec des infos d'interfaces de switchs.
J'arrive pour l'instant à lister les infos qui m'intérèssent grâce à un petit script awk dans une boucle while:
while read line
do
echo $line > temp.txt
awk -F\| '{for (i=1; i<25; i++) print $i}' temp.txt
done < $fichier
1/ Déjà premier truc qui me soule un peu, l'utilisation du fichier temp.txt, car je n'arrivais pas à lui mettre en souce une commande (type $(echo $line)). Avez-vous une solution?
2/ Sinon j'obtiens donc bien une liste de mes informations qui sort ainsi:
4227809
GigabitEthernet1/0/24
gigabitEthernet
1522
0
0:1e:c1:c6:f8:d8
down
down
99:0:16:10.55
403635924
3801068358
38997521
23003
34312273
0
2713656531
4227154371
766850125
0
0
0
SNMPv2-SMI::zeroDotZero
Du coup j'aimerais mettre ces valeurs dans les champs correspondant de ma BDD (pas forcément directement hein ). J'imaginais donc les mettres dans une variable numérotée et ensuite faire un traitement dessus. Exemple 1=id_interface, 2=type, etc
Est-il possible de directement le faire dans le awk, en associant les nombres avec les chaines correspondantes? => $i = print $i
Je teste encore qques manières de faire le 2nd point, mais j'ai souvent des erreurs ou alors la variable i n'est plus prise en compte
pour votre aide
Message édité par g-ridaz le 13-04-2011 à 11:19:49