Les Allergies
Alimentaires
Posez votre question Signaler

Script Shell et AWK

pcsystemd 423Messages postés 10 mai 2008Date d'inscription 1 mars 2012Dernière intervention - Dernière réponse le 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
Lire la suite 

Script Shell et AWK »

37 réponses
Réponse
+0
moins plus
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
;-))
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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]$
;-))
pcsystemd- 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
jipicy- 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
pcsystemd- 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



Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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]$  
;-))
pcsystemd- 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
jipicy- 13 mai 2008 à 17:51
C'est quoi la commande ? Le tout ?
Ou uniquement "cat toto.tpl | mail -s '' toto@toto.fr" ?
pcsystemd- 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
Ajouter un commentaire
Réponse
+0
moins plus
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
;-))
jipicy- 13 mai 2008 à 18:24
Ben je viens de te donner la solution au-dessus !!!
pcsystemd- 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
jipicy- 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.
Ajouter un commentaire
Réponse
+0
moins plus
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
;-))
pcsystemdjipicy - 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
jipicy- 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...
pcsystemd- 14 mai 2008 à 14:32
Pour les variables elles sont indiquées dans mon message du dessus .

voila le résultat avec set -xv

$ set -xv
$ stats.sh
stats.sh
+ stats.sh
sed: -e expression #1, char 298: Unknown option to 's'
Null message body; hope that's ok

pour ce qui est de la portion du script :

sed '
> s/<DATE>/'"${DATE}"'/
s/<DATE>/'"${DATE}"'/
> s/<PUSH>/'"${PUSH}"'/
s/<PUSH>/'"${PUSH}"'/
> s/<PUSHOLD>/'"${PUSHOLD}"'/
s/<PUSHOLD>/'"${PUSHOLD}"'/
> s/<NBNEWSLETTER>/'"${NBNEWSLETTER}"'/
s/<NBNEWSLETTER>/'"${NBNEWSLETTER}"'/
> s/<NBNEWSLETTEROLD>/'"${NBNEWSLETTEROLD}"'/
s/<NBNEWSLETTEROLD>/'"${NBNEWSLETTEROLD}"'/
> s/<NBCDC>/'"${NBCDC}"'/
s/<NBCDC>/'"${NBCDC}"'/
> s/<NBCDCOLD>/'"${NBCDCOLD}"'/
s/<NBCDCOLD>/'"${NBCDCOLD}"'/
> s/<VENTE>/'"${VENTE}"'/
s/<VENTE>/'"${VENTE}"'/
> s/<LOC>/'"${LOC}"'/
s/<LOC>/'"${LOC}"'/
> s/<VENTEOLD>/'"${VENTEOLD}"'/
s/<VENTEOLD>/'"${VENTEOLD}"'/
> s/<LOCOLD>/'"${LOCOLD}"'/
s/<LOCOLD>/'"${LOCOLD}"'/
> s/<CONFI>/'"${CONFI}"'/
s/<CONFI>/'"${CONFI}"'/
> s/<SIMPL>/'"${SIMPL}"'/
s/<SIMPL>/'"${SIMPL}"'/
> s/<CONFIOLD>/'"${CONFIOLD}"'/
s/<CONFIOLD>/'"${CONFIOLD}"'/
> s/<SIMPLOLD>/'"${SIMPLOLD}"'/
s/<SIMPLOLD>/'"${SIMPLOLD}"'/
> s/<DATEOLD>/'"${DATEOLD}"'/
s/<DATEOLD>/'"${DATEOLD}"'/
> '${TMPDIR}/stat.tpl
'${TMPDIR}/stat.tpl
+ sed '
s/<DATE>//
s/<PUSH>//
s/<PUSHOLD>//
s/<NBNEWSLETTER>//
s/<NBNEWSLETTEROLD>//
s/<NBCDC>//
s/<NBCDCOLD>//
s/<VENTE>//
s/<LOC>//
s/<VENTEOLD>//
s/<LOCOLD>//
s/<CONFI>//
s/<SIMPL>//
s/<CONFIOLD>//
s/<SIMPLOLD>//
s/<DATEOLD>//
/tmp/stat.tpl'
sed: -e expression #1, char 230: Extra characters after command

Merci
Ajouter un commentaire
Réponse
+0
moins plus
Il m'est très difficile de deviner où se situe l'erreur comme ça ;-\

Que contient ton fichier TEMPLATE "stat_century.tpl" exactement ?
pcsystemd- 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
Ajouter un commentaire
Réponse
+0
moins plus
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.
pcsystemd- 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
Ajouter un commentaire
Réponse
+0
moins plus
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}"
pcsystemd- 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
Ajouter un commentaire
Réponse
+0
moins plus
Pffff, je cale là :-(((

Bon essaie de virer tous les chevrons (< et >) autant du fichier TEMPLATE que dans le script, on verra bien...
pcsystemd- 14 mai 2008 à 17:33
oui je vais faire cela.

Merci beaucoup vraiment pour le temps que tu m'accorde.
pcsystemd- 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 : http://groups.yahoo.com/group/sed-users/

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/


jipicy- 16 mai 2008 à 13:22
Merci et honte à moi de ne pas y avoir pensé à cette histoire de "frontière de mot" ;-[
Ajouter un commentaire
Ce document intitulé « Script Shell et AWK » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?