Script et SED

Résolu
pcsystemd -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Bon j'ai essayé avec SED mais je m'arrache les cheveux bon allez je met carte sur table car la cela fait trois jours que je cherche la solution et je ne trouve pas :

Tout d'abord voila une portion du script en question :

[CODE]if [ -f "${TMPDIR}/nb_toto_${DATE}.lst" ]
then
echo 'nombre de votes simples et doubles au '${DATE} >> ${TMPDIR}/stat_site_${DATE}.lst
cat ${TMPDIR}/nb_toto_${DATE}.lst|sed -e 's/|//g' >> ${TMPDIR}/stat_site_${DATE}.lst
fi[/CODE]

le fichier nb_toto_${DATE}.lst contient :
nombre de vote simple : | 125455
nombre de vote double : | 25645

Ce que je souhaite faire c'est tout les mois recevoir le contenu de ce fichier mais je souhaite ajouter les stats du mois dernier du style et le tout que je redirige vers le fichier stat_site_${DATE}.lst :

nombre de vote simple : 125455 (contre 115644 en Avril)
nombre de vote double : 25645 (contre 24968 en Avril)

J'y suis arrivé pour le fichier ci-dessous car il contient qu'un chiffre:
2564452

Voila ce que j'ai fait et cela fonctionne :

[CODE]if [ -f "${TMPDIR}/nb_abonnement_${DATE}.lst" ]
then
ABO=`cat ${TMPDIR}/nb_abonnement_${DATE}.lst`
cp -f ${TMPDIR}/nb_abonnement_${DATE}.lst ${TMPDIR}/nb_abonnement_old.lst
ABOHOLD=`cat ${TMPDIR}/nb_abonnement_old.lst`
echo 'Au '${DATE} ': il y a '${ABO}' abonnements (contre '${ABOHOLD}' en '${DATESOLD}') ' >> ${TMPDIR}/stat_site_${DATE}.lst
fi[/CODE]

Avez vous une idée ?

Merci

9 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Pour récupérer que les chiffres de ton fichier avec "sed" :
    sed 's/[^[:digit:]]//g' fichier
    Uniquement la ligne des votes simples :
     sed -n '/simple/ s/[^[:digit:]]//gp' fichier
    Des votes doubles :
     sed -n '/double/ s/[^[:digit:]]//gp' fichier
    Sinon pour récupérer que les chiffres, tu peux faire aussi avec "grep" :
     grep -o '[0-9][0-9]*' fichier
    ;-))
    0
    1. pcsystemd
       
      Merci beaucoup pour vos infos. Mon souci était surtout comment insérer dans le fichier qui cointient deja les résultats du mois, les chiffres du mois antécédent:

      nombre de vote simple : 125455
      nombre de vote double : 25645

      je copie le fichier du mois que je rennome en old pour pouvoir recuperer les chiffres le mois prochain

      cp -f fichier fichier.old

      Je traite le fichier avec SED pour ne récuperer que les chiffres du mois dernier

      cat fichier.old | sed 's/[^[:digit:]]//g' > fichier avec les chiffres uniquement

      135648
      25645

      mais c'est aprés comment insérer cela a la suite du style :

      nombre de vote simple : 125455 (contre 24968 en Avril)
      nombre de vote double : 25645 (contre 24968 en Avril)

      Merci
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    $ cat resultat_du_mois.txt 
    nombre de vote simple : 125455
    nombre de vote double : 25645
    
    $ cat fichier_old.txt 
    115644
    24968
    
    $ simple=$(sed -n '1p' fichier_old.txt)
    $ echo $simple
    115644
    
    $ double=$(sed -n '2p' fichier_old.txt)
    $ echo $double
    24968
    
    $ sed "1 {s/.*/& (contre $simple en Avril)/};2 {s/.*/& (contre $double en Avril)/}" resultat_du_mois.txt 
    nombre de vote simple : 125455 (contre 115644 en Avril)
    nombre de vote double : 25645 (contre 24968 en Avril)
    
    $ 
    Ceci n'est qu'un exemple. Pour faire plus simple, tu peux récupérer directement les valeurs "simple" et "double" directement dans le fichier original, sans passer par un fichier "old"...

    Le résultat est ici affiché sur l'écran, tu peux soit le rediriger dans un fichier "> nouveau_fichier" ou faire en sorte que le changement soit effectif sur le fichier lu en entrée en rajoutant l'option "-i.bak" à la commande "sed" (le .bak" est facultatif, ça crée juste une copie de sauvegarde du fichier original).

    ;-))
    0
    1. pcsystemd
       
      Grace a tes infos voila une partie de mon script shell mais j'ai une erreur de synthaxe SED :

      fi
      if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]
      then
      CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
      SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
      echo 'nombre de votes simples et doubles au '${DATE} >> ${TMPDIR}/stat_${DATE}.lst
      cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre $CONFI en $DATEOLD)/};2 {s/.*/& (contre $SIMPL en $DATEOLD)/}' >> ${TMPDIR}/stat_${DATE}.lst
      cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/[^[:digit:]]//g' > ${TMPDIR}/nb_votes_old.lst

      else
      echo 'error' | mail -s "statistiques votes: nombre de votes simples et doubles le ${DATE}" toto@toto.fr
      fi

      je lance mon script et voila l'erreur que j'ai :

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

      As tu une idée?

      Merci encore
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > pcsystemd
         
        Il te faut entourer l'expression avec des quotes doubles et non des quotes simples pour que les variables soient interprétées, comme dans mon exemple et ça devrait rouler...

        Voir SED - Le remplacement de variables
        0
      2. pcsystemd > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Désolé mais j'ai essayé ce que tu m'indiques mais cela ne fonctionne toujours pas j'ai la meme erreur mais avec un numéro different du style :

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

        J'avais déjà lu ton excellent tuto sur SED mais j'ai de nouveau jeter un coup d'oeil et j'ai tout essayé avec double cotes, simple cote expression avec simples cotes et variable entre doubles cotes et l'inverse mais toujours meme erreur il n'y a que le numero de char qui change.

        Merci encore pour le temps que tu m'accorde
        0
      3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > pcsystemd
         
        Que contiennent les variables ? Il y a des chemins dedans (slash) ?

        Affiche un echo de tes 2 variables s'il te plaît.
        0
      4. pcsystemd > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Je remet le bout de script :

        if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]
        then
        CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
        SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
        echo 'nombre de votes simples et doubles au '${DATE} >> ${TMPDIR}/stat_${DATE}.lst
        cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre $CONFI en $DATEOLD)/};2 {s/.*/& (contre $SIMPL en $DATEOLD)/}' >> ${TMPDIR}/stat_${DATE}.lst
        cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/[^[:digit:]]//g' > ${TMPDIR}/nb_votes_old.lst

        else
        echo 'error' | mail -s "statistiques votes: nombre de votes simples et doubles le ${DATE}" toto@toto.fr
        fi

        puis voici ce que contienne les variables présentes :

        $ TMPDIR="/tmp/`whoami`"
        $ echo $TMPDIR
        /tmp/toto

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

        DATESOLD=`date -d '-1 month' '+%B'`
        CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
        SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"

        Merci
        0
  3. pcsystemd
     
    Franchement merci beaucoup jippicy car je me creuse la tête depuis plusieurs jours mais bon je débute et ta réponse est clair et précise franchement c'est rare d'avoir une aide comme cela sur le net .

    Merci beaucoup je tente cela et je te dirais ce qu'il en est.
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Bon je crois avoir décelé d'où vient l'erreur. Essaie avec cette syntaxe :
    sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en '"${DATEOLD}"')/};2 {s/.*/& (contre '"${SIMPL}"' en '"${DATEOLD}"')/}'
    PS. Quand je te demandais ce que contenaient les variables, c'était plutôt des variables "$SIMPL" et "$DATEOLD" que je parlais ;-))
    0
    1. pcsystemd
       
      Je suis désolé mais cela ne fonctionne pas et j'ai beau chercher d'ou vient le souci je ne trouve pas c'est désesperent

      sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en '"${DATEOLD}"')/};2 {s/.*/& (contre '"${SIMPL}"' en '"${DATEOLD}"')/}'

      j'ai une errreur :

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


      Merci encore
      0
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Peux-tu afficher le contenu du fichier "nb_votes_old.lst" ainsi que le contenu des variables "$CONFI", "$SIMPL" et "$DATEOLD" ?
    0
    1. pcsystemd
       
      contenu du fichier nb_votes_old.lst
      14580
      57275

      contenu de $CONFI
      CONFI="$(sed -n '1p' /${TMPDIR}/nb_mandat_consim_old.lst)"

      contenu de $SIMPL
      SIMPL="$(sed -n '2p' /${TMPDIR}/nb_mandat_consim_old.lst)"

      contenu de $DATESOLD
      DATESOLD=`date -d '-1 month' '+%B'`

      Merci
      0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Si tu définis tes variables une à une depuis un shell, puis que tu exécutes chaque commande toujours depuis un shell, est-ce que ça marche ?

    Essaie d'exécuter ton script en mode verbeux, rajoute "set -xv" après la ligne "shebang".
    Fais-en de même pour les commandes depuis le shell si elles foirent, lances d'abord la commande "set -xv" et exécute tes commandes ("set -" pour revenir à la normale).
    0
    1. pcsystemd
       
      pas de problème si je defini mes variables une a une depuis un shel et que je les execute en mode DEBUG

      $ CONFI="$(sed -n '1p' /${TMPDIR}/nb_votes_old.lst)"
      sed -n '1p' /${TMPDIR}/nb_votes_old.lst
      ++ sed -n 1p //tmp//nb_cotes_old.lst
      + CONFI=14594

      sauf comme d'hab ci-dessous

      $ cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' )/};2 {s/.*/& (contre '"${SIMPL}"' en )/}' >> ${TMPDIR}/stat_${DATE}.lst
      + cat /tmp/nb_votes_.lst
      + sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en )/};2 {s/.*/& (contre '"${SIMPL}"' en )/}'
      sed: -e expression #1, char 27: Unknown option to 's'


      Merci
      0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Là je ne vois pas du tout d'où est-ce que ça pourrait venir ;-\

    Essaie d'interpréter les variables à la place du shell et de taper la commande sed...

    Que contient le ficher "nb_votes_${DATE}.lst" ? Et pourquoi cette première commande dans ton sed "s/|//g" ???
    0
    1. pcsystemd
       
      le ficher "nb_votes_${DATE}.lst" contient :

      nombre de vote simple : |125455
      nombre de vote double : |25645

      c'est le fichier que je traite avec sed "s/|//g" pour retirer le |

      Merci pour toute ton aide vraiment car j'ai trouvé cela tres enrichissant et surtout c'est rare de trouver une aide aussi constructive sur le net.
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > pcsystemd
         
        Bon j'ai refait les tests chez moi avec toutes les données et ça passe très bien ;-\

        Je ne vois vraiment pas ce qui cloche ! ;-\
        Quelle version de "sed" ? Quel environnement ? Quel shell ?

        Dans les variables interprétées, il n'y a aucun slash ou caractère susceptible d'être mal interprété par sed ou par le shell ?

        Si tu peux, définis toutes tes variables et affiches-les :
        variable1="..."
        echo $variable1
        variable2="..."
        echo $variable2
        etc.
        ;-))
        0
      2. pcsystemd > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Bon voila enfin c'est résolu cela venait de la version de SED en version 3.2 cela ne fonctionne pas mais en 4 oui sachant que la machine ou s'execute le script est une machine en prod et a comme version de SED la 3.2. Par contre je serais curieux de savoir ce qui n'est plus compatible avec la version 3.2 dans mon script .

        Merci mille fois vraiment
        0
  9. dieu
     
    je viens de voir son meme message sur un autre forum il utilises un tres vieux gnu sed genre version 3
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Oups, j'avions pas vu ;-[

      Merci ;-)
      0
    2. pcsystemd
       
      voila ce que j'appelle une réponse constructive pffff!!!
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > pcsystemd
         
        Il ne faisait que répondre à la question que j'avais posée au post #19 à savoir "Quelle version de "sed" ? ", et ce avant même que tu répondes au post #21, donc pas de quoi dédaigner sa réponse, tu ne crois pas ?
        0