Extraire un code retour

Extraire un code retour - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 24-10-2007 à 11:59:50    

:hello: hello
Mon sujet je creer un fichier FIC1 par un grep -E  
FIC1
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk
= Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/pause7200
= JCLFILE   : /users/exploit/bin/BA850.Prod
= Exit Status           : 0
Les lignes JCFILE sont des jobs finis(code retour 0) sauf 1 job qui est en cour Pause7200  
Je le transforme par un awk pour faire un fichier FIC2
awk '
{
        if ($0 ~ /JCLFILE/) {
                gsub(/^.*\//,"",$0) #-- suppression de tous les caractM-hres jusqu au dernier /
                printf("%s ",$0)
                getline   #-- lecture enreg. suivant
                gsub(/^.* : /,"",$0)   #-- suppression de tous les caractM-hres jusqu au :
                print $0
        }
} ' FIC1 > FIC2
 
FIC2
FtpBaanUk 0
pause7200 /users/exploit/bin/BA850.Prod
 
Mon souci : comme pause7200 est en cour il me donne pas de code retour et la ligne de dessous remonte  
comment peut on la laisser en dessous ?  
 
Merci de vos reponses :

Reply

Marsh Posté le 24-10-2007 à 11:59:50   

Reply

Marsh Posté le 24-10-2007 à 12:02:59    

J'ai rien compris !
 
Sinon les précédentes valeurs de JCLFILE sont pas écrasées quand tu fais ça ?

Citation :

FIC1
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk
= Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/pause7200
= JCLFILE   : /users/exploit/bin/BA850.Prod
= Exit Status           : 0


---------------
Be the one with the flames.
Reply

Marsh Posté le 24-10-2007 à 13:49:38    

Non  
exemple voici mon fichier FIC1 apres le grep -E
--------------------------------------------------
= JCLFILE   : /users/exploit/bin/EPR01.Prod
= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/BA850.Prod
= Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk
= Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk
= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EISMS.Prod
= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/BA850.Prod
= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EPR02.Prod
= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EPR01.Prod
= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EPR01.Prod
= Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk
= Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/pause7200
= JCLFILE   : /users/exploit/bin/BA850.Prod
= Exit Status           : 0
 
et en sortie mon fichier FIC2 apres le awk
--------------------------------------------
EPR01.Prod 0
BA850.Prod 0
FtpBaanUk 0
FtpBaanUk 0
EISMS.Prod 0
BA850.Prod 0
EPR02.Prod 0
EPR01.Prod 0
EPR01.Prod 0
FtpBaanUk 0
pause7200 /users/exploit/bin/BA850.Prod
 
Apres je viens lire ce fichier FIC2 dans une boucle que voici  
while read nom code
do
        if [ $code = 0 ] ; then
                echo "Pas de Plantage sur le JOB $nom" 2>&1
        else
                echo "Plantage sur le JOB $nom" 2>&1
        fi
done < FIC2
 
Le probléme c'est quand un fichier est cours le fichiers FIC2 est tout décallé  
 
 

Reply

Marsh Posté le 24-10-2007 à 13:51:45    

Tu devrais mettre tes lignes de code dans des balises "fixed" ou "code", ça serait plus lisible :/


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 14:08:51    

Peux me donner un exemple .....je debute en Ksh, aprés un mini formation  je me lance !  
je me suis deja fais aidé pour mon awk  dans un autre forum  
 
Merci

Reply

Marsh Posté le 24-10-2007 à 14:12:59    

euh, ben quand tu postes ici, tu tapes code (ex: [code_ici] mais sans le _ici) et à la fin de ton code, tu tapes code (ex: [/code_ici] idem, sans le _ici), histoire que ça soit plus lisible pour nous.
 
Parce que là franchement, je m'y retrouve pas (j'ai surement la réponse, mais j'y vois rien :D)
 
edit: si tu veux un exemple:
 

Code :
  1. #! /bin/bash
  2. fonction_kitue() {
  3.    echo "Haha t'es mort !"
  4.    exit 0
  5. }


Message édité par wedgeant le 24-10-2007 à 14:15:03

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 14:43:35    

Excuse je viens de comprendre le truc des forums  
en fait voici mon script dans son entier  

Code :
  1. DIR19=/util/maestro/maestro/stdlist
  2. RES01=/usr/users/lab/FIC1
  3. RES02=/usr/users/lab/FIC2
  4. while [ TRUE ]
  5. do
  6.      for control in "$DIR19"
  7.        do
  8.           rm $RES02 $RES01
  9.           touch  $RES01; touch $RES02
  10.           repereH=`date +%H`
  11.           DIRDATE=$AN.$Mois.$Jour
  12.           cd $control/$DIRDATE
  13.             if  [ -f O*.$repereH* ] 2>/dev/null
  14.                then
  15.                   print " On vient traiter le fichier....." >/dev/null
  16.                   cat O*.$repereH* | grep -E "Exit Status | JCLFILE" >>$RES01 
  17.                     awk ' 
  18.                          {
  19.                             if ($0 ~ /JCLFILE/) {
  20.                                gsub(/^.*\//,"",$0) #-suppression de tous les caractM-hres jusqu au dernier /  
  21.                                printf("%s ",$0)
  22.                                getline   #-- lecture enreg. suivant
  23.                                gsub(/^.* : /,"",$0)   #-- suppression de tous les caractM-hres jusqu au :
  24.                                print $0
  25.                            }
  26.                               } ' FIC1 > FIC2
  27.                  while read nom code
  28.                    do
  29.                      if [ $code = 0 ] ; then
  30.                         echo "Pas de Plantage sur le JOB $nom" 2>&1
  31.                      else
  32.                         echo "Plantage sur le JOB $nom" 2>&1
  33.                         echo "Plantage ${nom}" | mailx -s "Plantage d'un job de la ${nom}"     
  34.                      fi
  35.                    done < FIC2
  36.            fi
  37.       done
  38.    sleep 3600
  39. done
  40. exit 0

Reply

Marsh Posté le 24-10-2007 à 14:48:03    

Ok, c'est plus lisible :jap:
 
Donc ton souci se situe à quel endroit ?
Si j'ai compris, tu check les codes retour de tes JCL, mais quand le job n'est pas encore terminé ça foire car tu n'as pas de code retour, c'est ça ?


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 14:55:31    

sinon ça va, vous voulez pas un peu de lubrifiant pour vos bloatware en shell/awk ? Je ne comprends pas trop pourquoi s'acharner alors qu'on peut faire plus simple, plus souple et plus robuste (détection d'erreur) en perl/python/ruby/etc.

Reply

Marsh Posté le 24-10-2007 à 14:57:11    

Taz a écrit :

sinon ça va, vous voulez pas un peu de lubrifiant pour vos bloatware en shell/awk ? Je ne comprends pas trop pourquoi s'acharner alors qu'on peut faire plus simple, plus souple et plus robuste (détection d'erreur) en perl/python/ruby/etc.


 [:mouais]  
 
Ok, t'aimes bien les gentils amis en mousse toi ? genre [:cerveau tt] ??


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 14:57:11   

Reply

Marsh Posté le 24-10-2007 à 15:00:05    

Oui  
en fait je viens lire FIC2 dans ma boucle read
si $code = 0 je fais rien  
  sinon j'envoie un mail.
Je le fais tourner toutes les heures (pour nos astreintes soir et week-end).
mais le probléme c'est quand il y a un job en cour ca me decalle tout mon fichier FIC2 en entrée  
 
Montré dans l'exemple plus haut.
 
Merci de ton aide    

Reply

Marsh Posté le 24-10-2007 à 15:04:43    

Il faudrait:
- soit lire les 2 lignes directement pour vérifier s'il y a un code retour présent (pas glop car ça veut dire que s'il n'y a pas de code retour sur la 2e ligne, il faut faire passer celle-ci en 1er ... etc ...)
- soit au préalable fusionner le code retour sur la même ligne que le nom du job qui correspond [:icon3]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 15:12:21    

comme ceci  ?
EPR01.Prod 0  
FtpBaanUk 0  

Reply

Marsh Posté le 24-10-2007 à 15:15:41    

Si je prend ton fichier d'origine, il faudrait le transformer en ça, pour que ça soit plus facile à traiter:

= JCLFILE   : /users/exploit/bin/EPR01.Prod = Exit Status           : 0
= JCLFILE   : /users/exploit/bin/BA850.Prod = Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk = Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk = Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EISMS.Prod = Exit Status           : 0
= JCLFILE   : /users/exploit/bin/BA850.Prod = Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EPR02.Prod = Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EPR01.Prod = Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EPR01.Prod = Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk = Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/pause7200
= JCLFILE   : /users/exploit/bin/BA850.Prod = Exit Status           : 0


 
Après, il suffit de cherches les différents bouts aux bons endroits :)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 15:21:21    

OK je vais essayer de rebidouiller mon awk pour obtenir ce resultat
Apres je serais un peu pommé pour chercher  les différents bouts aux bons endroits  !!!

Reply

Marsh Posté le 24-10-2007 à 15:26:00    

Pas forcément, tu fais une première extraction en utilisant ":" comme Field Separator:

Code :
  1. awk -F: '{print $2 $3}' LIGNE


Tu devrais obtenir quelque chose comme ça:

/users/exploit/bin/EPR01.Prod = Exit Status 0
/users/exploit/bin/BA850.Prod = Exit Status 0
/usr/local/exploit/bin/FtpBaanUk = Exit Status 0
/usr/local/exploit/bin/FtpBaanUk = Exit Status 0
/users/exploit/bin/EISMS.Prod = Exit Status 0
/users/exploit/bin/BA850.Prod = Exit Status 0
/users/exploit/bin/EPR02.Prod = Exit Status 0
/users/exploit/bin/EPR01.Prod = Exit Status  0
/users/exploit/bin/EPR01.Prod = Exit Status 0
/usr/local/exploit/bin/FtpBaanUk = Exit Status 0
/usr/local/exploit/bin/pause7200
/users/exploit/bin/BA850.Prod = Exit Status 0

 

Après, yapuka ;)


Message édité par wedgeant le 24-10-2007 à 15:26:41

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 15:26:40    

wedgeant a écrit :


 [:mouais]

 

Ok, t'aimes bien les gentils amis en mousse toi ? genre [:cerveau tt] ??


nan mais c'est une véritable question.
T'as même le droit d'utiliser a2p pour te faire un squelette.
Je ne te rappelle pas qu'un script shell, sauf option, si une commande foire, il passe allègrement à la suivante.

Message cité 2 fois
Message édité par Taz le 24-10-2007 à 15:27:51
Reply

Marsh Posté le 24-10-2007 à 15:29:12    

Taz a écrit :

nan mais c'est une véritable question.
T'as même le droit d'utiliser a2p pour te faire un squelette.
Je ne te rappelle pas qu'un script shell, sauf option, si une commande foire, il passe allègrement à la suivante.


Je veux bien, mais là s'il n'a à dispo qu'un shell et awk, ben il fait avec les moyens du bord :spamafote:

 

edit: et pis bon, sortir l'artillerie lourde pour parser un fichier ... [:cerveau branlette]


Message édité par wedgeant le 24-10-2007 à 15:29:50

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 15:37:16    

je confirme je n'ai que ksh sur unix Tru64 pour m'en sortir !!!!

Reply

Marsh Posté le 24-10-2007 à 15:49:06    

:pt1cable:  

Code :
  1. cat FIC1 | awk -F: '{print $2 $3}'
  2. /users/exploit/bin/EPR01.Prod
  3. 0
  4. /users/exploit/bin/BA850.Prod
  5. 0

Reply

Marsh Posté le 24-10-2007 à 15:50:07    

Héhéhé, ben voila :)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 15:54:47    

ca n'a pas trop donné le mem resultat  !!!! les lignes ne sont pas fusionées ensemble .....

Reply

Marsh Posté le 24-10-2007 à 15:56:37    

Tu n'as pas fusionné avant ??


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 16:00:08    

:ouch: ou dois je placer cette instruction dans mon script ?

Code :
  1. awk -F: '{print $2 $3}' LIGNE

Reply

Marsh Posté le 24-10-2007 à 16:00:57    

Ben après avoir fusionné les lignes :D
 
Tu fusionnes d'abord et après seulement, tu commences à traiter les infos ;)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 16:08:00    

Taz a écrit :


nan mais c'est une véritable question.
T'as même le droit d'utiliser a2p pour te faire un squelette.
Je ne te rappelle pas qu'un script shell, sauf option, si une commande foire, il passe allègrement à la suivante.


 
 
Avec un "set -e" au début, le script s'arrête à la première erreur. Ok c'est un peu une fausse réponse, car personne ou presque ne fait ça...


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 24-10-2007 à 16:08:05    

Je suis d'accord avec toi .......mais comment fais tu en script pour fusionner des lignes dans un fichier ?
moi je sais pas faire  :??:  


Avant  
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk  
= Exit Status           : 0  
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk  
= Exit Status           : 0  
Apres  
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk = Exit Status           : 0  
= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk = Exit Status           : 0  

Reply

Marsh Posté le 24-10-2007 à 16:13:48    

Tu fais un 1er passage avec awk sur le fichier, en lisant la 1ere ligne, puis la suivante.
Si la 2e ligne commence par "= Exit Status", alors dans la 1ere, tu remplaces le "\n" par rien: gsub(/\n/,"",$0) (ça veut dire que ton job s'est déjà terminé)
Sinon, tu continues en considérant que la 2e ligne devient la 1ere (ça veut dire que ton job tourne toujours).
 
J'ai pas de terminal sous la main là, mais ça doit se faire plutôt simplement ça non ?


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 24-10-2007 à 16:27:36    

Je vais chercher....mais comme ca, c'est un trop dur pour moi  !!!

Reply

Marsh Posté le 25-10-2007 à 11:01:21    

Me revoici, aprés avoir demandé de l'aide a un de mes collégues, on a fait ensemble ce code la pour fusionner les lignes  
   

Code :
  1. cat O*.$repereH* | grep -E "Exit Status | JCLFILE" >>FIC1
  2.               awk ' BEGIN {l = 1}
  3.                {
  4.                 ligne = $0
  5.                  if (l % 2 == 1)
  6.                   ligne1=ligne
  7.                    if (l % 2 == 0)
  8.                     if (ligne ~ /Exit/)
  9.                      print (ligne1 ligne)
  10.                     else
  11.                      {
  12.                       print ligne1
  13.                        ligne1=ligne
  14.                        l = l - 1
  15.                      }
  16.                 #print (ligne)
  17.                 l = l +1
  18.                } ' FIC1

Reply

Marsh Posté le 25-10-2007 à 11:04:34    

Ca parait un peu lourd comme ça, mais j'ai l'impression que ça devrait marcher.
Ton fichier FIC1 ressemble à quoi après ça ?


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 25-10-2007 à 11:23:32    

Voici voila le FIC1  


= JCLFILE   : /usr/local/exploit/bin/FtpBaanUk= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EPR02.Prod= Exit Status           : 0
= JCLFILE   : /usr/local/exploit/bin/pause7200
= JCLFILE   : /users/exploit/bin/EISMS.Prod= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/BA850.Prod= Exit Status           : 0
= JCLFILE   : /users/exploit/bin/EPR01.Prod= Exit Status           : 0

Reply

Marsh Posté le 25-10-2007 à 11:29:33    

[:jar jar] ... enfin presque :D
 
Est-ce que par hasard, tu disposerais de la commande "sed" ?
Là, ça s'rait tip top :jap:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 25-10-2007 à 11:34:40    

oui, bien sur mais j'ai jamais pratiqué !!!!!

Reply

Marsh Posté le 25-10-2007 à 11:38:44    

[:jar jar] [:jar jar]
 
sed marche comme awk, il permet de faire des remplacements dans une chaine :jap:
 

Code :
  1. sed -e 's/=//g; s/Exit Status//g; s/JCLFILE//g; s/\t/ /g; s/\ \+/ /g' FIC1


Après avoir créé ton fichier FIC1
 
Et fais voir le résultat :jap:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 25-10-2007 à 11:43:21    

sed -e 's/=//g; s/Exit Status//g; s/JCLFILE//g; s/\t/ /g; s/\ \+/ /g' FIC1


    : /usr/local/exploi /bin/F pBaanUk            : 0
    : /usr/local/exploi /bin/F pBaanUk            : 0
    : /users/exploi /bin/EPR02.Prod            : 0
    : /usr/local/exploi /bin/pause7200
    : /users/exploi /bin/BA850.Prod            : 0
    : /users/exploi /bin/EISMS.Prod            : 0
    : /users/exploi /bin/BA850.Prod            : 0
    : /users/exploi /bin/EPR01.Prod            : 0


 
Les t ont disparus !!!!!!!!!! :pt1cable:

Reply

Marsh Posté le 25-10-2007 à 11:46:46    

lab7 a écrit :

Les t ont disparus !!!!!!!!!! :pt1cable:


ouhla [:god]
 

Code :
  1. sed -e 's@=@@g; s@JCLFILE@@g; s@Exit Status@@g; s@\t@ @g; s@\ \+@ @g; s@:@@g' FIC1


 
 [:croquignol]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 25-10-2007 à 11:50:37    

sed -e 's@=@@g; s@JCLFILE@@g; s@Exit Status@@g; s@\t@ @g; s@\ \+@ @g; s@:@@g' FIC1
 


      /usr/local/exploi /bin/F pBaanUk             0
     /usr/local/exploi /bin/F pBaanUk             0
     /users/exploi /bin/EPR02.Prod             0
     /usr/local/exploi /bin/pause7200
     /users/exploi /bin/BA850.Prod             0
     /users/exploi /bin/EISMS.Prod             0
     /users/exploi /bin/BA850.Prod             0
     /users/exploi /bin/EPR01.Prod             0


 [:croquignol]

Reply

Marsh Posté le 25-10-2007 à 11:54:06    

Tu voudrais faire quoi en fait ?

Reply

Marsh Posté le 25-10-2007 à 12:29:49    

Nettoyer ton fichier pour que tu te retrouves avec le nom du job + le code retour :)
 
retires le "s@\t@ @g;" ...


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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