Script Shell et AWK

Fermé
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - 13 mai 2008 à 10:07
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 16 mai 2008 à 13:22
Bonjour,

voila j'ai cette portion de script Shell qui fonctionne très bien avec l'editeur SED (encore merci a la personne de ce forum qui m'a aidé il se reconnaitra). Je souhaiterais faire la meme chose mais avec AWK



if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]

then

VENTE="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"

LOC="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"

echo 'nombre de votes simple et doubles au '${DATE} >> ${TMPDIR}/stat_${DATE}.lst

cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e "s%|%%g;1 {s%.*%& (contre ${VENTE} en ${DATEOLD})%};2 {s%.*%& (contre ${LOC} en ${DATEOLD})%}" >> ${TMPDIR}/stat_${DATE}.lst

cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's%[^[:digit:]]%%g' > ${TMPDIR}/nb_votes_old.lst

Avez vous une idée?

Merci
A voir également:

11 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 mai 2008 à 10:17
Salut,

Il faudrait peut être expliqué ce que font les portions de codes avec "sed", tout le monde n'est pas à même de comprendre ces parties là, tu ne crois pas ?

Quelques explications seraient donc les bienvenues.

Pour les variables VENTE et LOC, ceci devrait faire l'affaire (en adaptant le numéro de ligne) :
awk 'NR==1 {print $0}' fichier
;-))
0
_vince Messages postés 37 Date d'inscription mardi 30 janvier 2007 Statut Membre Dernière intervention 14 mai 2008
13 mai 2008 à 10:29
Comme l'a dit jipicy, quelques explications seraient les bienvenues. Tout le monde n'est pas bilingue sed/awk. Et pour resoudre un probleme, il faut d'abord l'enoncer clairement.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 mai 2008 à 12:10
Poue répondre un peu à ton attente pour la seconde partie du "sed" :
[tmpfs]$ cat plop
nombre de vote simple : | 125455
nombre de vote double : | 25645

[tmpfs]$ var=115644

[tmpfs]$ awk -F"|" 'NR==1 {print $1,$2,"(contre '"$var"' en Avril)"}' plop
nombre de vote simple :   125455 (contre 115644 en Avril)

[tmpfs]$
;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
13 mai 2008 à 13:55
Tiens, tiens merci jipicy,

j'ai besoin de quelques explications sur ce que tu m'indiques. Concernant

awk 'NR==1 {print $0}' fichier

Il faut que j'insérer cela de cette maniere

VENTE="$(sed -n '1p' ${TMPDIR}/nb_mandat_old.lst)"

avec awk

VENTE="awk NR==1 {print $0} ${TMPDIR}/nb_mandat_old.lst"

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
13 mai 2008 à 13:59
Comme ceci plutôt (sans oublier les quotes autour de de l'expression "awk") :
VENTE=$(awk 'NR==1 {print $0}' ${TMPDIR}/nb_mandat_old.lst)
;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
13 mai 2008 à 14:06
Ok merci.

Une question vu que tu m'a aidé pour SED. Je souhaiterais crée un fichier TEMPLATE par exemple :

vote <TAG1>
Votes olds <EMAIL>
etc..

puis depuis mon script avec SED pouvoir remplacer les champs entre <> dans mon template.

Est ce possible?

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
13 mai 2008 à 14:11
Oui c'est possible. Après reste à savoir quoi, quand, où et comment en fonction des besoins...

Comme toujours, il faut des exemples concrets !!!
Avant => Après
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
13 mai 2008 à 14:37
Bon prenons l'exemple que tu connais :

je créais un fichier toto.tpl qui sera mon template (ce sera le fichier que j'enverais par mail. il sera de forme suivante

Bonjour,

Voici les résultats du <DATE>

Nombre de votes simple = <RESULT> contre <RESULTOLD> du <DATEOLD>
Nombre de vote doubles = <RESULT> contre <RESULTOLD> du <DATEOLD>
etc..

puis un deuxieme fichier toto.sh contenant mon script avec SED

Voila je ne sais pas si j'ai été clair car je ne sais pas trop comment m'y prendre.

Merci



0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
13 mai 2008 à 12:58
Désolé, effectivement je vais expliqué ce que fait le script :

VENTE="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"

LOC="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"

sont les variables qui permettent de recuperer dans le fichier ${TMPDIR}/nb_votes_old.lst le resultat de la ligne 1 et de la ligne 2 grace a SED

cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e "s%|%%g;1 {s%.*%& (contre ${VENTE} en ${DATEOLD})%};2 {s%.*%& (contre ${LOC} en ${DATEOLD})%}" >> ${TMPDIR}/stat_${DATE}.lst

permet d'inserer dans le fichier stat le contenu du fichier nb_votes et d'inserer a la fin de la ligne 1 et 2 le contenu des variables VENTE et LOC toujours grace a SED via des expressions regulieres
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 mai 2008 à 15:36
En espérant avoir compris ta demande. A adapter bien sûr...
[tmpfs]$ cat toto.tpl
Bonjour,

Voici les résultats du <DATE>

Nombre de votes simple = <RESULT1> contre <VENTE> du <DATEOLD>
Nombre de vote doubles = <RESULT2> contre <LOC> du <DATEOLD>
etc..

[tmpfs]$ cat toto.sh

#! /bin/bash

DATE=$(date '+%A %d %B %Y')
DATEOLD=$(date -d '1 months ago' '+%A %d %B %Y')
# VENTE="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
VENTE=xxxxx
# LOC="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
LOC=yyyyy
RESULT1=XXXXX
RESULT2=YYYYY

sed '
s/<DATE>/'"${DATE}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<RESULT1>/'"${RESULT1}"'/
s/<RESULT2>/'"${RESULT2}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
' toto.tpl > fichier_mail.txt

[tmpfs]$ ./toto.sh
[tmpfs]$ cat fichier_mail.txt
Bonjour,

Voici les résultats du mardi 13 mai 2008

Nombre de votes simple = XXXXX contre xxxxx du dimanche 13 avril 2008
Nombre de vote doubles = YYYYY contre yyyyy du dimanche 13 avril 2008
etc..
[tmpfs]$  
;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
13 mai 2008 à 16:09
Merci beaucoup c'est vraiment super.

J'ai deux questions :

je ne comprends pas

# VENTE="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
VENTE=xxxxx

tu veux dire par la que VENTE=xxxxx est le resultat de VENTE="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)" que je dois inserer dans mon script?

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
13 mai 2008 à 16:16
En fait j'ai mis en commentaire ta variable (avec sa syntaxe) car je n'avais pas de quoi la définir et du coup j'en ai créé une factice pour pouvoir faire mes tests et te montrer un exemple concret...

Désolé j'aurai du le préciser ;-(

Par contre j'avais bien marqué en début de message "A adapter..." ;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
13 mai 2008 à 17:47
Dans la commande qui suit si je veux envoyer le fichier toto.tpl par mail est ce que je peux faire

sed '
s/<DATE>/'"${DATE}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<RESULT1>/'"${RESULT1}"'/
s/<RESULT2>/'"${RESULT2}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
'
cat toto.tpl | mail -s '' toto@toto.fr

MErci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
13 mai 2008 à 17:51
C'est quoi la commande ? Le tout ?
Ou uniquement "cat toto.tpl | mail -s '' toto@toto.fr" ?
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
13 mai 2008 à 17:56
Dans l'exemple que tu me donne

sed '
s/<DATE>/'"${DATE}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<RESULT1>/'"${RESULT1}"'/
s/<RESULT2>/'"${RESULT2}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
' toto.tpl > fichier_mail.txt

tu traite le fichier toto.tpl que tu redirige vers fichier_mail.txt hors ce que je souhaiterais c'est envoyer le fichier toto.tpl par mail directement depuis mon script par exemple avec

sed '
s/<DATE>/'"${DATE}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<RESULT1>/'"${RESULT1}"'/
s/<RESULT2>/'"${RESULT2}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
' cat toto.tpl | mail -s '' toto@toto.fr

Est ce que cela est possible ?

Voila une partie de mon script qu'en pense tu?

touch ${TMPDIR}/stat_${DATE}.lst

if [ -f "${TMPDIR}/nb_push_${DATE}.lst" ]

then

NBPUSH=`cat ${TMPDIR}/nb_push_${DATE}.lst`
NBPUSHOLD=`cat ${TMPDIR}/nb_push_old.lst`

mv -f ${TMPDIR}/nb_push_${DATE}.lst ${TMPDIR}/nb_push_old.lst

fi

if [ -f "${TMPDIR}/nb_newsletter_${DATE}.lst" ]

then

NBNEWSLETTER=`cat ${TMPDIR}/nb_newsletter_${DATE}.lst`
NBNEWSLETTEROLD=`cat ${TMPDIR}/nb_newsletter_old.lst`

mv -f ${TMPDIR}/nb_newsletter_${DATE}.lst ${TMPDIR}/nb_newsletter_old.lst

fi

if [ -f "${TMPDIR}/nb_cdc_${DATE}.lst" ]

then

NBCDC=`cat ${TMPDIR}/nb_cdc_${DATE}.lst`
NBCDCOLD=`cat ${TMPDIR}/nb_cdc_old.lst`

mv -f ${TMPDIR}/nb_cdc_${DATE}.lst ${TMPDIR}/nb_cdc_old.lst

fi

if [ -f "${TMPDIR}/nb_${DATE}.lst" ]

then

cat ${TMPDIR}/nb_${DATE}.lst | sed -e 's%|%%g;s%[^[:digit:]]%%g' >> ${TMPDIR}/stat_${DATE}.lst
CONFI="$(sed -n '1p' ${TMPDIR}/stat_${DATE}.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/stat_${DATE}.lst)"

CONFIOLD="$(sed -n '1p' ${TMPDIR}/nb_old.lst)"

SIMPLOLD="$(sed -n '2p' ${TMPDIR}/nb_old.lst)"



cat ${TMPDIR}/nb_${DATE}.lst | sed -e 's%[^[:digit:]]%%g' > ${TMPDIR}/nb_old.lst

fi

if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]

then

cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's%|%%g;s%[^[:digit:]]%%g' >> ${TMPDIR}/stat_${DATE}.lst

VENTE="$(sed -n '3p' ${TMPDIR}/stat_${DATE}.lst)"
LOC="$(sed -n '4p' ${TMPDIR}/stat_${DATE}.lst)"
VENTEOLD="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"

LOCOLD="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"



cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's%[^[:digit:]]%%g' > ${TMPDIR}/nb_votes_old.lst

fi

sed '
s/<DATE>/'"${DATE}"'/
s/<PUSH>/'"${PUSH}"'/
s/<PUSHOLD>/'"${PUSHOLD}"'/
s/<NBNEWSLETTER>/'"${NBNEWSLETTER}"'/
s/<NBNEWSLETTEROLD>/'"${NBNEWSLETTEROLD}"'/
s/<NBCDC>/'"${NBCDC}"'/
s/<NBCDCOLD>/'"${NBCDCOLD}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<VENTEOLD>/'"${VENTEOLD}"'/
s/<LOCOLD>/'"${LOCOLD}"'/
s/<CONFI>/'"${CONFI}"'/
s/<SIMPL>/'"${SIMPL}"'/
s/<CONFIOLD>/'"${CONFIOLD}"'/
s/<SIMPLOLD>/'"${SIMPLOLD}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
'
cat toto.tpl | mail -s '' toto@toto.fr

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 mai 2008 à 18:12
Pour rappel, le fichier "toto.tpl" est un TEMPLATE, donc il est sensé ne pas être modifié, d'où la redirection dans un fichier.

Mais tu peux très bien faire (et je viens de tester et ça marche très bien) :
sed '
s/<DATE>/'"${DATE}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<RESULT1>/'"${RESULT1}"'/
s/<RESULT2>/'"${RESULT2}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
' toto.tpl | mail -s "Envoi du ${DATE}" toto@toto.fr
;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
13 mai 2008 à 18:23
Ah oui effectivement suis je bête le fichier TEMPLATE ne doit pas etre modifier mais alors comment faire pour envoyer le résultat du template par mail?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
13 mai 2008 à 18:24
Ben je viens de te donner la solution au-dessus !!!
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
13 mai 2008 à 20:41
ah pardon ok donc cela devrait etre bon :
sed '
s/<DATE>/'"${DATE}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<RESULT1>/'"${RESULT1}"'/
s/<RESULT2>/'"${RESULT2}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
' toto.tpl > fichier_mail.txt | mail -s '' toto@toto.fr

Merci beaucoup et bonne soirée
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
13 mai 2008 à 22:10
Non ! Tu n'as pas besoin de la redirection vers le fichier "fichier_mail.txt", tu l'envoies directement à travers le "pipe" vers la commande "mail" :
sed '
...
...
...
' toto.tpl | mail -s '' toto@toto.fr 
Regarde à nouveau mon exemple, tu peux même y mettre la date d'envoi comme sujet de ton mail.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 mai 2008 à 22:40
Pour reprendre ton script :
touch ${TMPDIR}/stat_${DATE}.lst

if [ -f "${TMPDIR}/nb_push_${DATE}.lst" ]

then

NBPUSH=`cat ${TMPDIR}/nb_push_${DATE}.lst`
NBPUSHOLD=`cat ${TMPDIR}/nb_push_old.lst`

mv -f ${TMPDIR}/nb_push_${DATE}.lst ${TMPDIR}/nb_push_old.lst

fi

if [ -f "${TMPDIR}/nb_newsletter_${DATE}.lst" ]

then

NBNEWSLETTER=`cat ${TMPDIR}/nb_newsletter_${DATE}.lst`
NBNEWSLETTEROLD=`cat ${TMPDIR}/nb_newsletter_old.lst`

mv -f ${TMPDIR}/nb_newsletter_${DATE}.lst ${TMPDIR}/nb_newsletter_old.lst

fi

if [ -f "${TMPDIR}/nb_cdc_${DATE}.lst" ]

then

NBCDC=`cat ${TMPDIR}/nb_cdc_${DATE}.lst`
NBCDCOLD=`cat ${TMPDIR}/nb_cdc_old.lst`

mv -f ${TMPDIR}/nb_cdc_${DATE}.lst ${TMPDIR}/nb_cdc_old.lst

fi

if [ -f "${TMPDIR}/nb_${DATE}.lst" ]

then

cat ${TMPDIR}/nb_${DATE}.lst | sed -e 's%|%%g;s%[^[:digit:]]%%g' >> ${TMPDIR}/stat_${DATE}.lst
CONFI="$(sed -n '1p' ${TMPDIR}/stat_${DATE}.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/stat_${DATE}.lst)"

CONFIOLD="$(sed -n '1p' ${TMPDIR}/nb_old.lst)"

SIMPLOLD="$(sed -n '2p' ${TMPDIR}/nb_old.lst)"



cat ${TMPDIR}/nb_${DATE}.lst | sed -e 's%[^[:digit:]]%%g' > ${TMPDIR}/nb_old.lst

fi

if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]

then

cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's%|%%g;s%[^[:digit:]]%%g' >> ${TMPDIR}/stat_${DATE}.lst

VENTE="$(sed -n '3p' ${TMPDIR}/stat_${DATE}.lst)"
LOC="$(sed -n '4p' ${TMPDIR}/stat_${DATE}.lst)"
VENTEOLD="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"

LOCOLD="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"



cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's%[^[:digit:]]%%g' > ${TMPDIR}/nb_votes_old.lst

fi

sed '
s/<DATE>/'"${DATE}"'/
s/<PUSH>/'"${PUSH}"'/
s/<PUSHOLD>/'"${PUSHOLD}"'/
s/<NBNEWSLETTER>/'"${NBNEWSLETTER}"'/
s/<NBNEWSLETTEROLD>/'"${NBNEWSLETTEROLD}"'/
s/<NBCDC>/'"${NBCDC}"'/
s/<NBCDCOLD>/'"${NBCDCOLD}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<VENTEOLD>/'"${VENTEOLD}"'/
s/<LOCOLD>/'"${LOCOLD}"'/
s/<CONFI>/'"${CONFI}"'/
s/<SIMPL>/'"${SIMPL}"'/
s/<CONFIOLD>/'"${CONFIOLD}"'/
s/<SIMPLOLD>/'"${SIMPLOLD}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
' toto.tpl | mail -s "Envoi du ${DATE}" toto@toto.fr
;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
14 mai 2008 à 07:32
Y a t-il une importance que la ligne

toto.tpl | mail -s "Envoi du ${DATE}" toto@toto.fr soit au niveau de la derniere cote (') du sed?

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
14 mai 2008 à 07:37
Oui ;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
14 mai 2008 à 08:30
Ok merci beaucoup et bonne journée.
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
14 mai 2008 à 13:35
Bon voila j'ai testé mon script mais j'ai deux erreurs :

sed: -e expression #1, char 295: Extra characters after command
Null message body; hope that's ok

je reçois le mail mais vide apparement mon template n'est pas pris en compte serais ce qu'il n'est pas dans le meme repertoire pourtant j'ai adapte le chemin :

sed '
s/<DATE>/'"${DATE}"'/
s/<PUSH>/'"${PUSH}"'/
s/<PUSHOLD>/'"${PUSHOLD}"'/
s/<NBNEWSLETTER>/'"${NBNEWSLETTER}"'/
s/<NBNEWSLETTEROLD>/'"${NBNEWSLETTEROLD}"'/
s/<NBCDC>/'"${NBCDC}"'/
s/<NBCDCOLD>/'"${NBCDCOLD}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<VENTEOLD>/'"${VENTEOLD}"'/
s/<LOCOLD>/'"${LOCOLD}"'/
s/<CONFI>/'"${CONFI}"'/
s/<SIMPL>/'"${SIMPL}"'/
s/<CONFIOLD>/'"${CONFIOLD}"'/
s/<SIMPLOLD>/'"${SIMPLOLD}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
' ${TMPDIR}/stat.tpl | mail -s "stat au ${DATE}" toto@toto.fr

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
14 mai 2008 à 13:55
Bon alors, déjà est-ce que tes variables sont susceptibles de contenir des caractères comme un "/" (slash) ?

Compte les caractères à partir de la 1ère quote de "sed" pour déterminer où se situe l'erreur...


Ensuite, rajoute "set -xv" en début de script (après le shebang (#! /bin/bash)) pour voir si toutes tes variables sont bien interprétées...

Avant d'essayer d'envoyer le mail, assures-toi que ton script marche. Retire le "| mail -s "stat au ${DATE}" toto@toto.fr " en fin de script et vois si tu as bien le résultat escompté sur la sortie standard (l'écran) !!!

Exécute chaque partie de ton script une par une, puis ajoute-les une par une aussi qu'une fois la précédente validée...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
14 mai 2008 à 14:38
Il m'est très difficile de deviner où se situe l'erreur comme ça ;-\

Que contient ton fichier TEMPLATE "stat_century.tpl" exactement ?
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
14 mai 2008 à 14:51
Bonjour,
Voici ce que contient mon template :

Voici les stats au <DATE>

Push :
il y a <PUSH> inscriptions au push (contre <NBPUSHOLD> en <DATEOLD>)

Newsletter :
il y a <NEWSLETTER> inscriptions à la newsletter (contre <NEWSLETTEROLD> en <DATEOLD>)

Coups :
il y a <NBCDC> coups programmés (contre <NBCDCOLD> en <DATEOLD>)

Nombre de votes simple et double au <DATE> :
nombre de votes simples : <CONFI> (contre <CONFIOLD> en <DATEOLD>)
nombre de votes doubles : <SIMPL> (contre <SIMPLOLD> en <DATEOLD>)

Nombre de votants au <DATE> :
nombre de votants simples : <VENTE> (contre <VENTEOLD> en <DATEOLD>)
nombre de votant doubles : <LOC> (contre <LOCOLD> en <DATEOLD>)

Bonne journée.

Juste une remarque j'ai comme l'impression au vu de l'erreur :

sed: -e expression #1, char 298: Unknown option to 's'

qu'il y a un souci avec le s/ de sed mais bon ce n'est qu'une remarque je ne suis pas encore assez calé pour en etre sur.

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
14 mai 2008 à 15:03
il y a un souci avec le s/ de sed
D'où ma demande sur le contenu des variables, dont je ne sais toujours pas ce qu'elles contiennent ;-((

Le "set -xv" m'intéressait que pour voir l'interprétation des variables, là apparemment, le script est interrompu par l'erreur sur "sed", avant même une quelconque interprétation de quoi que ce soit ;-(((

Donc, affiche moi le contenu de chaque variable, sans quoi je ne suis d'aucune utilité.

Dans le TEMPLATE, on peut aussi virer les chevrons (< et >) qui ne servent à rien vu que chaque partie à remplacer est un mot en majuscule...
Il se peut aussi que ce soit ça qui gène dans "sed" vu que c'est un caractère utilisé pour les regex.
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
14 mai 2008 à 15:43
Voila ce que contienne mes variables

NBPUSH="$(sed -n '1p' ${TMPDIR}/stat_${DATE}.lst)"
NBPUSHOLD=`cat ${TMPDIR}/nb_push_old.lst`
NBNEWSLETTER="$(sed -n '2p' ${TMPDIR}/stat_${DATE}.lst)"
NBNEWSLETTEROLD=`cat ${TMPDIR}/newsletter_old.lst`
NBCDC="$(sed -n '3p' ${TMPDIR}/stat_${DATE}.lst)"
NBCDCOLD=`cat ${TMPDIR}/nb_old.lst`
CONFI="$(sed -n '4p' ${TMPDIR}/stat_${DATE}.lst)"
SIMPL="$(sed -n '5p' ${TMPDIR}/stat_${DATE}.lst)"
CONFIOLD="$(sed -n '1p' ${TMPDIR}/nb_m_old.lst)"
SIMPLOLD="$(sed -n '2p' ${TMPDIR}/nb_m_old.lst)"
VENTE="$(sed -n '6p' ${TMPDIR}/stat_${DATE}.lst)"
LOC="$(sed -n '7p' ${TMPDIR}/stat_${DATE}.lst)"
VENTEOLD="$(sed -n '1p' ${TMPDIR}/nbe_old.lst)"
LOCOLD="$(sed -n '2p' ${TMPDIR}/nbe_old.lst)"

j'ai enlevé les <> dans mon TEMPLATE puis executé hors du script la commande sed suivante :

$sed '
s/<DATE>/'"${DATE}"'/
s/<NBPUSH>/'"${PUSH}"'/
s/<NBPUSHOLD>/'"${PUSHOLD}"'/
s/<NBNEWSLETTER>/'"${NBNEWSLETTER}"'/
s/<NBNEWSLETTEROLD>/'"${NBNEWSLETTEROLD}"'/
s/<NBCDC>/'"${NBCDC}"'/
s/<NBCDCOLD>/'"${NBCDCOLD}"'/
s/<VENTE>/'"${VENTE}"'/
s/<LOC>/'"${LOC}"'/
s/<VENTEOLD>/'"${VENTEOLD}"'/
s/<LOCOLD>/'"${LOCOLD}"'/
s/<CONFI>/'"${CONFI}"'/
s/<SIMPL>/'"${SIMPL}"'/
s/<CONFIOLD>/'"${CONFIOLD}"'/
s/<SIMPLOLD>/'"${SIMPLOLD}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
' stats.tpl > fichier.txt

il me creait bien le fichier fichier.txt mais aucunes variables n'est interpreté . Voici le contenu de fichier.txt


Bonjour,

Voici les stats au

Push :
il y a NBPUSH inscriptions au push (contre NBPUSHOLD en DATEOLD)

Newsletter :
il y a NBNEWSLETTER inscriptions à la newsletter (contre NBNEWSLETTEROLD en DATEOLD)

Coups :
il y a NBCDC coups programmés (contre NBCDCOLD en DATEOLD)

Nombre de votes simple et double au DATE :
nombre de votes simple : CONFI (contre CONFIOLD en DATEOLD)
nombre de votes double : SIMPL (contre SIMPLOLD en DATEOLD)

Nombre de votants simple et double au DATE :
nombre de votants simples : VENTE (contre VENTEOLD en DATEOLD)
nombre de votants doubles : LOC (contre LOCOLD en DATEOLD)

Bonne journée.

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
14 mai 2008 à 15:52
Ce que j'ai besoin c'est de la valeur de chaque variable une fois interprétée...
NBPUSH="$(sed -n '1p' ${TMPDIR}/stat_${DATE}.lst)"
Ok, mais moi je voudrais le résultat de :
echo "$NBPUSH"
etc.
etc.
...

Mets-moi aussi en plus des variables citées au-dessus la valeur de "${DATE}" et "${DATEOLD}"
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
14 mai 2008 à 16:43
ok voici ce que tu demandes :

$ DATEOLD=`date -d '-1 month ago' '+%B %Y'`
DATEOLD=`date -d '-1 month ago' '+%B %Y'`
date -d '-1 month ago' '+%B %Y'
++ date -d '-1 month ago' '+%B %Y'
+ DATEOLD=June 2008

$ echo $DATEOLD
echo $DATEOLD
+ echo June 2008
June 2008



$ DATE=`date '+%d-%m-%Y'`
DATE=`date '+%d-%m-%Y'`
date '+%d-%m-%Y'
++ date +%d-%m-%Y
+ DATE=14-05-2008

$ echo $DATE
echo $DATE
+ echo 14-05-2008
14-05-2008


$ NBPUSH="$(sed -n '1p' ${TMPDIR}/stat_${DATE}.lst)"
NBPUSH="$(sed -n '1p' ${TMPDIR}/stat_${DATE}.lst)"
sed -n '1p' ${TMPDIR}/stat_${DATE}.lst
++ sed -n 1p /tmp/stat_14-05-2008.lst
+ NBPUSH=123

$ echo $NBPUSH
+ echo 123
123

$ NBPUSHOLD=`cat ${TMPDIR}/nb_push_old.lst`
NBPUSHOLD=`cat ${TMPDIR}/nb_push_old.lst`
cat ${TMPDIR}/nb_push_old.lst
++ cat /tmp/nb_push_old.lst
+ NBPUSHOLD=19687

$ echo $NBPUSHOLD
echo $NBPUSHOLD
+ echo 19687
19687

$ NBNEWSLETTER="$(sed -n '2p' ${TMPDIR}/stat_${DATE}.lst)"
NBNEWSLETTER="$(sed -n '2p' ${TMPDIR}/stat_${DATE}.lst)"
sed -n '2p' ${TMPDIR}/stat_${DATE}.lst
++ sed -n 2p /tmp/stat_14-05-2008.lst
+ NBNEWSLETTER=1234

$ echo $NBNEWSLETTER echo $NBNEWSLETTER
+ echo 1234
1234

$ NBNEWSLETTEROLD=`cat ${TMPDIR}/newsletter_old.lst`
NBNEWSLETTEROLD=`cat ${TMPDIR}/newsletter_old.lst`
cat ${TMPDIR}/newsletter_old.lst
++ cat /tmp/newsletter_old.lst
+ NBNEWSLETTEROLD=36963

$ echo $NBNEWSLETTEROLD
+ echo 36963
36963

etc.. voila pas de problème particulier

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
14 mai 2008 à 17:05
Pffff, je cale là :-(((

Bon essaie de virer tous les chevrons (< et >) autant du fichier TEMPLATE que dans le script, on verra bien...
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
14 mai 2008 à 17:33
oui je vais faire cela.

Merci beaucoup vraiment pour le temps que tu m'accorde.
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
16 mai 2008 à 12:35
Bon voila j'ai trouvé la solution donc je l'indique ça peut toujours servir a d'autres personnes :

Quand on souhaite remplacer des champs dans un fichier TEMPLATE :

sed -e "
s/\bDATE\b/${DATE}/
s/\bNBPUSH\b/${NBPUSH}/
s/\bPOLD\b/${POLD}/
s/\bNEWSLETTER\b/${NEWSLETTER}/
s/\bNOLD\b/${NOLD}/
s/\bCDC\b/${CDC}/
s/\bCCOLD\b/${CCOLD}/
" stats_century21.tpl | mail -s " ...

Le nom des variables ne doivent pas etre trop similaire, Il faut mettre des doubles cotes et apparement un marqueur s/\b et \b/ .

Pour plus de detail je vous ai mis la réponse a mon post sur le Group des users de SED : https://groups.yahoo.com/neo/groups/sed-users/info

Merci a tous ceux qui m'ont aidé et surtout a toi jipicy.


Further, as a favor to you I will point out that the order of the
lines in a sed script is very important. In particular

NBPUSH
NBPUSHOLD

and similar constructions will cause problems, because "NBPUSHOLD"
contains "NBPUSH" as a substring. When the sed reads a line into the
pattern space which contains "NBPUSHOLD", the sed script will match
"NBPUSH" on that pattern because it truly does match.

If you intend to search for whole words, you must reverse the order
of the patterns to find, so that the longer string comes first:

s/NBPUSHOLD/$etc/
s/NBPUSH/$etc/
s/VENTEOLD/$etc/
s/VENTE/$etc

Or an alternative is to use GNU sed (comes by default with every
GNU/Linux installation) and use the word-boundary marker, \b. E.g.,

s/\bNBPUSH\b/$one/
s/\bNBPUSHOLD\b/$two/
s/\bVENTE\b/$three/
s/\bVENTEOLD\b/$four/


0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
16 mai 2008 à 13:22
Merci et honte à moi de ne pas y avoir pensé à cette histoire de "frontière de mot" ;-[
0