Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/05/2008, 16h38   #1
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 145
Points : 31
Points : 31
Par défaut SED et variables.

Bonjour,

voila j'ai le fichier nb_toto_${DATE}.lst qui contient :

nombre de bombons : |14565
nombre de tonton : |57205

dans mon script je traite ce fichier avec SED pour supprimer le pipe puis je redirige le résultat vers un autre fichier stat_titi_${DATE}.lst.

Code :
cat ${TMPDIR}/nb_toto_${DATE}.lst|sed -e 's/|//g' >>  ${TMPDIR}/stat_titi_${DATE}.lst
Je souhaiterais pouvoir ajouter a mes deux lignes ce qui est en rouge avant de redirigé mon fichier nb_toto_${DATE}.lst vers stat_titi_${DATE}.lst:

nombre de bombons : |14565 (contre 14522)
nombre de tonton : |57205 (contre 2546)



SEd peut il insérer la valeur d'une variable déclarée du style sed -e a/$TATA sachant que a/ insérer du texte après la ligne.

Merci
pcsystemd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2008, 16h54   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 779
Points : 7 779
comme

Code :
1
2
3
4
5
6
7
initialbombons=........... ;initialtontons=...........; sed '
s/|//g
1a\
contre\ \('$initialbombons'\)
3a\
contre\ \('$initialtontons'\)
' ${TMPDIR}/nb_toto_${DATE}.lst >> ${TMPDIR}/stat_titi_${DATE}.lst
attention ici je force les numero de lignes 1 et 2 pour toi c'est peut etre different ou si tu sais pas à l'avance tu fais une recherche de pattern
Code :
1
2
/patern/$i\
truc à inserer
autre chose aussi :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SIUNIXS2:root # cat > /tmp/FP
nombre de bombons : |14565
nombre de tonton : |57205
SIUNIXS2:root # sed '
> s/|//g
> 1a\
> toto
> 2a\
> titi' /tmp/FP
nombre de bombons : 14565
toto
nombre de tonton : 57205
titi
SIUNIXS2:root #
append et insert fonctionnent sur des lignes completes

si tu veux ajouter en fin de ligne
il vaut mieux faire un substitude sur $

/recherche_champ/s/.*$/&valeur/

comme ça :

Code :
1
2
3
4
5
6
SIUNIXS2:root # sed ' s/|//g
> /bombons/s/.*$/&\ tutu/
> /tonton/s/.*$/&\ toto/' /tmp/FP
nombre de bombons : 14565 tutu
nombre de tonton : 57205 toto
SIUNIXS2:root #
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2008, 16h36   #3
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 145
Points : 31
Points : 31
Merci pour les infos super sympa.

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 :
1
2
3
4
5
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
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 :
1
2
3
4
5
6
7
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
Avez vous une idée ?

Merci
pcsystemd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 13h57   #4
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 145
Points : 31
Points : 31
Bonjour,

voila une partie de mon script shell mais j'ai une erreur de synthaxe SED :

Code :
1
2
3
4
5
6
7
8
9
10
11
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 :

Code :
sed: -e expression #1, char 46: Unknown option to 's'
Avez vous une idée?

Merci encore
pcsystemd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 09h35   #5
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 779
Points : 7 779
je reprends ce qui a été proposé : tu as juste oublié de déquoter les variables shell utilisées dans le sed
Code :
1
2
3
4
5
6
7
8
9
10
11
[tmp]# 
[tmp]# cat > FP 
nombre de vote simple : | 125455
nombre de vote double : | 25645
CONFI=0000
[tmp]# DATEOLD=1111
[tmp]# SIMPL=2222
[tmp]# sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en '"${DATEOLD}"')/};2 {s/.*/& (contre '"${SIMPL}"')/}' FP
nombre de vote simple :  125455 (contre 0000 en 1111)
nombre de vote double :  25645 (contre 2222)
[tmp]# rm FP
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 17h37   #6
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 145
Points : 31
Points : 31
Voila j'ai suivi tes instructions dans mon script shell :

Code :
1
2
3
4
5
6
7
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 vote simple 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
mais quand je l'execute j'ai l'erreur suivante :

Code :
sed: -e expression #1, char 37: Unknown option to 's'
Merci encore
pcsystemd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 18h02   #7
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 779
Points : 7 779
envoies nous le resultat de parceque bon sous AIX et linux ca marche ce qu'on te donne donc avec le GNU SED et avec le sed IBM
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 18h15   #8
Membre habitué
 
Inscription : novembre 2007
Messages : 103
Détails du profil
Informations personnelles :
Âge : 64
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2007
Messages : 103
Points : 109
Points : 109
Par défaut ed

Bonjour,

Je ne pratique plus depuis un moment mais ne serait-ce pas plus lisible avec "ed" ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SIMPLES=...
DOUBLES=...
 
cp nb_toto_${DATE}.lst stat_titi_${DATE}.lst
 
ed - "stat_titi_${DATE}.lst" << !
,s/|//g
1s/$/$SIMPLES/
2s/$/$DOUBLES/
w
q
!
IFA2377 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 19h26   #9
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 145
Points : 31
Points : 31
voila le résultat de la commande

$ sed --version
sed --version
+ sed --version
GNU sed version 3.02
Merci
pcsystemd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 07h47   #10
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 779
Points : 7 779
ah quand même on est au moins en version 4 peut etre une mise à jour serai bienvenue....
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 11h39   #11
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 145
Points : 31
Points : 31
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
pcsystemd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 11h42   #12
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 779
Points : 7 779
Citation:
Envoyé par IFA2377 Voir le message
Bonjour,

Je ne pratique plus depuis un moment mais ne serait-ce pas plus lisible avec "ed" ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SIMPLES=...
DOUBLES=...
 
cp nb_toto_${DATE}.lst stat_titi_${DATE}.lst
 
ed - "stat_titi_${DATE}.lst" << !
,s/|//g
1s/$/$SIMPLES/
2s/$/$DOUBLES/
w
q
!
sed c'est strictement la même chose que ed en presentation :
Code :
1
2
3
4
sed '/|//g
1s/$/$SIMPLES/
2s/$/$DOUBLES/
w fichier' fichieràtraiter.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h30.


 
 
 
 
Partenaires

Hébergement Web