Extraire un code retour - Codes et scripts - Linux et OS Alternatifs
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 |
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é
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
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
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 )
edit: si tu veux un exemple:
Code :
|
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 :
|
Marsh Posté le 24-10-2007 à 14:48:03
Ok, c'est plus lisible
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 ?
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.
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. |
Ok, t'aimes bien les gentils amis en mousse toi ? genre ??
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
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
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 |
Après, il suffit de cherches les différents bouts aux bons endroits
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 !!!
Marsh Posté le 24-10-2007 à 15:26:00
Pas forcément, tu fais une première extraction en utilisant ":" comme Field Separator:
Code :
|
Tu devrais obtenir quelque chose comme ça:
/users/exploit/bin/EPR01.Prod = Exit Status 0 |
Après, yapuka
Marsh Posté le 24-10-2007 à 15:26:40
wedgeant a écrit :
Ok, t'aimes bien les gentils amis en mousse toi ? genre ?? |
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.
Marsh Posté le 24-10-2007 à 15:29:12
Taz a écrit : nan mais c'est une véritable question. |
Je veux bien, mais là s'il n'a à dispo qu'un shell et awk, ben il fait avec les moyens du bord
edit: et pis bon, sortir l'artillerie lourde pour parser un fichier ...
Marsh Posté le 24-10-2007 à 15:37:16
je confirme je n'ai que ksh sur unix Tru64 pour m'en sortir !!!!
Marsh Posté le 24-10-2007 à 15:49:06
Code :
|
Marsh Posté le 24-10-2007 à 15:50:07
Héhéhé, ben voila
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 .....
Marsh Posté le 24-10-2007 à 15:56:37
Tu n'as pas fusionné avant ??
Marsh Posté le 24-10-2007 à 16:00:08
ou dois je placer cette instruction dans mon script ?
Code :
|
Marsh Posté le 24-10-2007 à 16:00:57
Ben après avoir fusionné les lignes
Tu fusionnes d'abord et après seulement, tu commences à traiter les infos
Marsh Posté le 24-10-2007 à 16:08:00
Taz a écrit : |
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...
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
|
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 ?
Marsh Posté le 24-10-2007 à 16:27:36
Je vais chercher....mais comme ca, c'est un trop dur pour moi !!!
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 :
|
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 ?
Marsh Posté le 25-10-2007 à 11:23:32
Voici voila le FIC1
|
Marsh Posté le 25-10-2007 à 11:29:33
... enfin presque
Est-ce que par hasard, tu disposerais de la commande "sed" ?
Là, ça s'rait tip top
Marsh Posté le 25-10-2007 à 11:38:44
sed marche comme awk, il permet de faire des remplacements dans une chaine
Code :
|
Après avoir créé ton fichier FIC1
Et fais voir le résultat
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
|
Les t ont disparus !!!!!!!!!!
Marsh Posté le 25-10-2007 à 11:46:46
lab7 a écrit : Les t ont disparus !!!!!!!!!! |
ouhla
Code :
|
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
|
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;" ...
Marsh Posté le 24-10-2007 à 11:59:50
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 :