Script Shell et AWK

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

--
L'accés au savoir est la premiére liberté de l'homme.
Configuration: Linux Debian
Mozilla 1.8.1.13

11 réponses

Résumé de la discussion

Un script Shell lit et transforme des fichiers de votes journaliers et calcule des statistiques (VENTE, LOC, DATE) en utilisant sed, puis compose un mail à partir d’un template. Les réponses expliquent comment adapter le script à awk et obtenir les valeurs interprétées des variables, tout en évitant les soucis de dépendances entre NBPUSH et NBPUSHOLD. D'autres soulignent l'importance de l'ordre des substitutions (NBPUSHOLD avant NBPUSH) et proposent d'envoyer directement le contenu du template par mail via une chaîne pass-through, notamment. En pratique, la solution finale montre comment remplacer les marqueurs entre balises dans le template en utilisant sed avec des délimiteurs et des mots limites, puis acheminer le résultat par mail.

Bobot (l’IA à votre service)
  1. Modérateur
    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
    1. 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
      1. Modérateur
        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
        1. 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
        2. Modérateur
          @pcsystemdComme 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
        3. @jipicyOk 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
        4. Modérateur
          @pcsystemdOui 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
        5. @jipicyBon 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
      2. 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
        1. Modérateur
          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
          1. 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
          2. Modérateur
            @pcsystemdEn 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
          3. @jipicyDans 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
          4. Modérateur
            @pcsystemdC'est quoi la commande ? Le tout ?
            Ou uniquement "cat toto.tpl | mail -s '' toto@toto.fr" ?
            0
          5. @jipicyDans 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
        2. Modérateur
          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
          1. 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
          2. Modérateur
            @pcsystemdBen je viens de te donner la solution au-dessus !!!
            0
          3. @jipicyah 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
          4. Modérateur
            @pcsystemdNon ! 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
        3. Modérateur
          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
          1. 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
          2. Modérateur
            @pcsystemdOui ;-))
            0
          3. @jipicyOk merci beaucoup et bonne journée.
            0
          4. @jipicyBon 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
          5. Modérateur
            @pcsystemdBon 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
        4. Modérateur
          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
          1. 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
        5. Modérateur
          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
          1. 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
        6. Modérateur
          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
          1. 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
        7. Modérateur
          Pffff, je cale là :-(((

          Bon essaie de virer tous les chevrons (< et >) autant du fichier TEMPLATE que dans le script, on verra bien...
          0
          1. oui je vais faire cela.

            Merci beaucoup vraiment pour le temps que tu m'accorde.
            0
          2. 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
          3. Modérateur
            @pcsystemdMerci et honte à moi de ne pas y avoir pensé à cette histoire de "frontière de mot" ;-[
            0