Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1132 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Résolu] Tableau à plusieurs colonnes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Tableau à plusieurs colonnes

n°2185272
El_Cyprian​o
Posté le 11-04-2013 à 09:57:51  profilanswer
 

Bonjour à tous,
 
Dans le cadre d'un de mes projets, je dois créer un tableau à plusieurs colonnes contenant des variables déjà définies. Je m'explique, le début de mon script est le suivant:
 

Code :
  1. port_trap=`cat /tmp/trap_up | grep ifIndex | cut -d' ' -f2`
  2. ip_switch=`cat /tmp/trap_up | grep snmpModules.18.1.3.0 | cut -d' ' -f2`
  3. echo $port_trap ; $ip_switch


 
Le fichier /tmp/trap_up est le suivant:
 

Citation :

SNMPv2-MIB::sysUpTime.0 0:0:02:02.32
SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkUp
IF-MIB::ifIndex.17 17
IF-MIB::ifAdminStatus.17 up
IF-MIB::ifOperStatus.17 up
SNMPv2-SMI::snmpModules.18.1.3.0 192.168.0.5
-----------------------------------------------
SNMPv2-MIB::sysUpTime.0 0:0:02:02.32
SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkUp
IF-MIB::ifIndex.14 14
IF-MIB::ifAdminStatus.14 up
IF-MIB::ifOperStatus.14 up
SNMPv2-SMI::snmpModules.18.1.3.0 192.168.0.5


 
Donc une fois le script terminé, j'obtiens sur mon terminal:

Citation :

17 14
192.168.0.5 192.168.0.5


 
Idéalement, je souhaiterais avoir:

Citation :


n°port    @ip_switch
17          192.168.0.5
14          192.168.0.5


 
Ainsi, à la vue de ce qu'il y a ci-dessus, je voudrais faire un tableau à deux colonnes mais je ne sais pas trop comment faire, j'ai essayé de passer par une boucle "for", je n'y suis pas arrivé, il ne me ressortait pas ce que je souhaitais, puis j'ai tenté le code "declare -a ARRAY" mais je n'ai pas bien compris la subtilité de cette commande. J'ai aussi pensé à exporter les variables dans un tableau excel, mais étant débutant en Bash, je ne sais pas trop comment m'y prendre.  
 
C'est pour cela que je quémande votre aide, afin que je puisse baisser mon ignorance envers Bash.
 
Je vous remercie de votre aide,


Message édité par El_Cypriano le 22-04-2013 à 11:08:39
mood
Publicité
Posté le 11-04-2013 à 09:57:51  profilanswer
 

n°2185297
El_Cyprian​o
Posté le 11-04-2013 à 14:06:51  profilanswer
 

Bon, j'ai réussi à faire deux colonnes, mais je n'ai pas l'impression que ce soit un tableau. En fait, j'ai repris le code précédent en le modifiant un peu:
 

Code :
  1. port_trap=`cat /tmp/trap_up | grep ifIndex | cut -d' ' -f2 >/etc/snmp/test`
  2. ip_switch=`cat /tmp/trap_up | grep snmpModules.18.1.3.0 | cut -d' ' -f2 > /etc/snmp/test2`
  3. paste test test2 > test3


 
quand je fais un "cat test3":
 

Citation :


17     192.168.0.5
14     192.168.0.5


 
Mais si je fais un "cp test3 test3.csv", mes lignes sont de la forme:
 

Citation :


17 -> 192.168.0.5
14 -> 192.168.0.5


 
Est-ce qu'il y a moyen de faire à partir de cela un autre tableau avec comme délimiteur le "->" ? Si oui, quelle est cette commande ?

n°2185357
Nukolau
Posté le 11-04-2013 à 15:52:19  profilanswer
 

première remarque en passant :
 

Code :
  1. cat fichier | grep chaine


 
C'est vraiment pas terrible ca créé un fork inutile. Privilégie plutôt un :
 

Code :
  1. grep chaine fichier


 
En ce qui concerne ton problème, je pense que le awk est tout indiqué. Si j'ai bien compris, ce que tu veux faire c'est associer le dernier champ de la ligne qui contient ifIndex avec le dernier champ de la ligne suivante qui contient snmpModules.
 
Si c'est bien ca, une commande dans le genre suivante devrait fonctionner :
 

Code :
  1. awk -F'[: ]' '{if ($3 ~ /ifIndex/) {PORT=$NF;}
  2.                if ($3 ~ /snmpModules/) {printf("%s;%s\n",PORT,$NF);}}' /tmp/trap_up

n°2185510
El_Cyprian​o
Posté le 12-04-2013 à 08:20:03  profilanswer
 

Etant un peu un noob de bash, j'imagine que c'est à cause du pipe qu'il y a de la bouffe de ressource.
 
Tu as exactement compris mon problème, je vais tenter ça. J'avais entendu parler de la commande "awk" mais j'avais lu de la doc dessus mais cela m'avait l'air assez incompréhensible  :sweat:  
 
Une petite question sur ton code, quand tu utilises le "~", c'est pour annoncer que $3 est une variable ?
 
En tout cas, je te remercie pour ton aide nukolau, je test ça et dès validation, ce sera un Résolu grâce à toi  :bounce:

n°2185521
Nukolau
Posté le 12-04-2013 à 09:46:52  profilanswer
 

oui la doc awk peux semble incompréhensible car en fait awk est un langage de programmation à lui tout seul :)
 
Pour faire simple :
 -F'[: ]'  : indique a awk qu'on va découper les lignes sur les caractères : et [espace]. Ainsi awk placera dans $1 tout ce qu'il y a avant le premier : ou espace, dans $2 le champ suivant etc.
 
$3 ~ /xxxx/ : expression régulière qui permet de tester le 3eme champ de la ligne. Ainsi, si on trouve quelque chose qui contient ifIndex, on stockera dans la variable PORT le dernier champ de la ligne (traduit en awk par $NF) et si on trouve un snmpModules on affichera sur la sortie "PORT;$NF"

n°2186910
El_Cyprian​o
Posté le 22-04-2013 à 10:52:58  profilanswer
 

Je ne sais pas si cela se fait, mais j'ai enlevé le "[Résolu]" pour une autre aide concernant à peu près au même problème.
 
Alors, j'ai un fichier qui contient les lignes suivantes:

Citation :


iso.3.6.1.2.1.4.22.1.2.17.192.168.0.8
iso.3.6.1.2.1.4.22.1.2.14.192.168.0.4


 
Ce que je souhaiterais avoir, c'est cela:

Citation :


port_host;ip_host
17;192.168.0.8
14;192.168.0.4


 
J'ai tenté par la commande "awk" mais je n'arrive à récupérer que l'adresse IP (qui d'ailleurs était séparée par des espaces et non des points, mais que j'ai rectifié avec la commande sed).  
 
J'ai alors tenté la commande

Code :
  1. printf "%s%s\n" $ip_host $port_ host (où $ip_host est une variable contenant l'adresse IP et $port_host le port)

. Le résultat est le suivant:

Citation :


192.168.0.8;192.168.0.4
17;14


 
Du coup, je ne sais pas ce qu'il faut changer ou ajouter dans mon printf pour que cela fonctionne.

n°2186922
El_Cyprian​o
Posté le 22-04-2013 à 11:08:11  profilanswer
 

En fait, c'est bon j'ai trouvé, voici mon code:
 

Code :
  1. awk -F'[.]' '{print $11";"$12"."$13"."$14"."$15}'


 
Et bim, voilà ce que cela me sort:
 

Citation :

17;192.168.0.8
14;192.168.0.4

n°2186925
Tuxerman12
Posté le 22-04-2013 à 11:17:08  profilanswer
 

En espérant que les lignes aient toujours le même nombre de groupes.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Résolu] Tableau à plusieurs colonnes

 

Sujets relatifs
Trouver la 1ere ligne vide d'un tableau et écrire dans les cellulestableau de pointeur sur structure dans une structure
[VBA] Savoir si n'importe quel caractère défini est plusieurs fois...Aide pour faire suivre un select case sur plusieurs cellules
[C#] Trier un tableau d'objetDiviser ma liste de news sur plusieurs pages
Tableau : je dois pouvoir ne pas perdre tous mes cheveux...[WORD 2010] Sélectionner et déplacer une ligne dans un tableau
Liste déroulante liée sur plusieurs onglets [Résolu]lsite chainée en ADA avec allocation static des objets dans un tableau
Plus de sujets relatifs à : [Résolu] Tableau à plusieurs colonnes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR