[SHELL/SED] Extraire un bout de chaine

Extraire un bout de chaine [SHELL/SED] - Shell/Batch - Programmation

Marsh Posté le 21-09-2015 à 09:09:38    

Bonjour,
 
je cherche a extraire un bout de donnée d'une chaine de caractère, mais je ne parviens pas à mes fin.
 
Prenons la chaine suivante

Code :
  1. /*-----------------standby_statistiques_inactive_DFPER-----------------*/;insert_job:standby_statistiques_inactive_DFPER;job_type:CMD;box_name:Inactive_DFPER;command:30248{BAT_DFPER}/statistiques.sh;machine:trt_inact_dfper;owner:dfpermgr;permission:gx,ge,wx,we;condition:d(standby_auto_test_inactive_DFPER);std_out_file:/tmp/_30248{DATEDUJOUR}.log;std_err_file:/tmp/_30248{DATEDUJOUR}.err;alarm_if_fail:t;send_notification:n;


 
J'aurais 4 champs a extraite, les 2er, insert_job et job_type ne bougerons pas.
par contre les 2 autres ne seront pas toujours à la meme place, il sagit de box_name et condition
 
je pensait faire un sed, en cherchant mes champs, et les extraires.
cependant, je n'y parviens pas.
 
j'ai essayer ceci ($LINE contient la ligne)

Code :
  1. echo $LINE | sed -e "/;insert_job:[.*];/p"


mais au final, ca me sort toute la ligne.
je pensait sinon le faire en AWK, mais je ne maitrise pas asser pour savoir comment faire.
 
Si quelqu'un a une idée, je suis preneur.
 
Merci de votre aide.


---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 21-09-2015 à 09:09:38   

Reply

Marsh Posté le 21-09-2015 à 10:58:35    

Bonjour !
 
Je pense qu'en effet, n outil du genre awk ou perl seront assez adaptés, à ceci près que comme on ne peut spécifier qu'un seul séparateur, il faudra faire une boucle par champ, mais cela ne paraît pas mortel.
 
Si j'arrive à croiser une machine avec un awk installé, je tenterai de vous proposer un premier jet entre midi et deux.
 
Bonne continuation !

Reply

Marsh Posté le 21-09-2015 à 11:49:16    

ok
en attente de votre jet :)
 
Merci


---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 21-09-2015 à 12:50:02    

chico008 a écrit :

ok
en attente de votre jet :)
 
Merci


 
Ceci semble pas mal, il ne vous reste plus qu'à adapter la dernière ligne pour obtenir la sortie que vous voulez :  
 
Fichier AWK à sauvegarder (cmd.awk par la suite)

Code :
  1. /insert_job/ \
  2. {\
  3.    trouve1=0;trouve2=0; \
  4.    for (i =1; i < NF; i++) \
  5.    { \
  6.       nb = split( $i, tab,  ":" ); \
  7.       if (nb == 2) \
  8.       {\
  9.           if (tab[1] == "condition" ) \
  10.           {\
  11.              trouve1 = 1;
  12.              condition = tab[2];
  13.           }\
  14.           if (tab[1] == "box_name" ) \
  15.           {\
  16.              trouve2 = 1;
  17.              box_name = tab[2];
  18.           }\
  19.       }\
  20.    }\
  21.    if (trouve1 && trouve2) printf("Condition : [%s] - Box_name : [%s]\n", condition, box_name);
  22. }


 
Ligne de commande :  

Code :
  1. awk -F\; -f cmd.awk fichier_entree


 
A priori, le fichier de commandes gère quelques cas d'erreur, peut-être pas tous ...
 
Bonne continuation !

Reply

Marsh Posté le 22-09-2015 à 06:51:39    

Merci du coup de main.
 
J'aurais preferer une ligne a integrer dans mon shell directement.
 
et au passage j'ai finalement contourner la difficulté avec un egrep qui me donne pile ce que je voulais avec mon fichier en entrée, qui me donne une info par ligne.
 
Mais en tout cas merci quand meme, j'aiun autre projet ou pour le coup les données sont dans ce cas la, et votre script poura me servir.


---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 22-09-2015 à 11:01:40    

Pas de souci. Pour l'intégration en une ligne de commande, c'est possible en concaténant le contenu du fichier et en remplaçant le -f cmd.axk par 'contenu du fichier concaténé', j'avais choisi cette option pour la lisibilité et la facilité de mise au point.
 
Bonne continuation !

Reply

Sujets relatifs:

Leave a Replay

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