Script et SED

Résolu/Fermé
pcsystemd - 3 mai 2008 à 21:18
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 6 mai 2008 à 23:17
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
A voir également:

9 réponses

touchepasaugrisbi Messages postés 75 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 15 juin 2008 4
4 mai 2008 à 00:20
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 897
4 mai 2008 à 11:01
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
4 mai 2008 à 14:11
$ 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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > pcsystemd
4 mai 2008 à 18:25
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
pcsystemd > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
4 mai 2008 à 18:49
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > pcsystemd
4 mai 2008 à 18:54
Que contiennent les variables ? Il y a des chemins dedans (slash) ?

Affiche un echo de tes 2 variables s'il te plaît.
0
pcsystemd > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
5 mai 2008 à 06:50
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
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

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 897
5 mai 2008 à 08:39
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mai 2008 à 17:22
Peux-tu afficher le contenu du fichier "nb_votes_old.lst" ainsi que le contenu des variables "$CONFI", "$SIMPL" et "$DATEOLD" ?
0
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mai 2008 à 18:39
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mai 2008 à 19:58
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > pcsystemd
6 mai 2008 à 09:53
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
pcsystemd > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
6 mai 2008 à 12:23
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
je viens de voir son meme message sur un autre forum il utilises un tres vieux gnu sed genre version 3
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 897
6 mai 2008 à 16:17
Oups, j'avions pas vu ;-[

Merci ;-)
0
voila ce que j'appelle une réponse constructive pffff!!!
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 897 > pcsystemd
6 mai 2008 à 23:17
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