[Résolu] Tableau à plusieurs colonnes

Tableau à plusieurs colonnes [Résolu] - Shell/Batch - Programmation

Marsh Posté le 11-04-2013 à 09:57:51    

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
Reply

Marsh Posté le 11-04-2013 à 09:57:51   

Reply

Marsh Posté le 11-04-2013 à 14:06:51    

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 ?

Reply

Marsh Posté le 11-04-2013 à 15:52:19    

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

Reply

Marsh Posté le 12-04-2013 à 08:20:03    

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:

Reply

Marsh Posté le 12-04-2013 à 09:46:52    

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"

Reply

Marsh Posté le 22-04-2013 à 10:52:58    

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.

Reply

Marsh Posté le 22-04-2013 à 11:08:11    

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

Reply

Marsh Posté le 22-04-2013 à 11:17:08    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed