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 14/09/2011, 11h15   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 54
Points : 14
Points : 14
Par défaut Aide script shell

Bonjour,

J'aurais besoin d'un petit peu d'aide car je dois réaliser un script shell. Cependant, je n'en ais jamais fait!!

Ce script doit :
- Copier un fichier dans un autre répertoire
- Recopie celui-ci dans un autre fichier (nomFichier+date et heure de la copie) en supprimant les sauts de ligne
- vide le fichier d'origine

Voici ce que j'ai fait pour le moment :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
#Récupération du fichier à copier
FICHIER_ORIGINAL = "/apps/webservers/dev3/getex/params/cre/fichier_creMIB.txt"
 
#Récupération de la date et de l'heure
DATE_DU_JOUR = 'date +%D%X'
 
#Copie du fichier vers un autre répertoire
cp FICHIER_ORIGINAL /apps/webservers/dev3/getex/params/creSave/fichier_creMIB$DATE_DU_JOUR.txt 
 
#Récupération du fichier recopié
FICHIER_RECOPIE = "/apps/webservers/dev3/getex/params/creSave/fichier_creMIB$DATE_DU_JOUR.txt"
 
#Substituer les fins de ligne par des espaces
sed 's/\n/ /' $FICHIER_RECOPIE
benjibul est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/09/2011, 11h32   #2
Membre habitué
 
Avatar de Levi59
 
Homme
Étudiant
Inscription : août 2011
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 46
Points : 126
Points : 126
Pour vider un fichier, une simple commande suffit :
Code :
echo > /chemin/vers/fichier
Levi59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h39   #3
Candidat au titre de Membre du Club
 
Inscription : mai 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 54
Points : 14
Points : 14
Citation:
Envoyé par Levi59 Voir le message
Pour vider un fichier, une simple commande suffit :
echo > /chemin/vers/fichier
Ok merci je vais regarder ça.

Et y a-t'il un moyen de vérifier que les actions faites avant de vider le fichier se sont bien déroulées?

Car dans mon cas, si la copie a eu un problème, je ne dois pas vider le fichier!
Et un autre petit problème je pense, la commande "sed" ne modifie pas le fichier mais affiche uniquement le résultat?!
Comment faire pour que le fichier soit modifié ?
benjibul est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/09/2011, 13h02   #4
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 375
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : octobre 2008
Messages : 1 375
Points : 2 034
Points : 2 034
1) Il ne faut pas d'espace autour du = pour les affectations
2) Pour récupérer la sortie d'une commande, c'est `command` et pas 'command'
3) Pour récupérer la valeur d'une variable, il faut mettre un $ : $FICHIER_ORIGINAL et pas FICHIER_ORIGINAL
4) sed ne vas pas modifier le fichier que tu passes en argument. Il se contente de le lire, de faire le traitement demandé, et d'envoyer le texte modifié sur sa sortie standard. Pour modifier un fichier il faut soit que tu utilises le flag -i (qui n'est pas standard), soit que tu lises un fichier et que tu rediriges la sortie dans un autre fichier (sed '...' input_file > output_file).
5) Ton expression sed n'est pas correcte. Utilises plutôt tr (tr '\n' ' ' < input_file > output_file)
matafan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 15h10   #5
Candidat au titre de Membre du Club
 
Inscription : mai 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 54
Points : 14
Points : 14
Merci pour toutes ces infos!

Je viens de modifier mon shell :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
#Vérification de l'existence du répertoire de destination des Cre sauvegardés
#Si le répertoire existeon ne fait rien
#Si le répertoire n'existe pas on le creer
if ! test -d /apps/webservers/dev3/getex/params/creSave
then
	mkdir /apps/webservers/dev3/getex/params/creSave
	chmod 777 /apps/webservers/dev3/getex/params/creSave
fi
 
#Récupération du fichier à copier
FICHIER_ORIGINAL="/apps/webservers/dev3/getex/params/cre/fichier_creMIB"
 
#Récupération de la date
DATE_DU_JOUR=`date +%d%m%Y`
 
#Récupération de l'heure
HEURE_DU_JOUR=`date +%X`
 
#Copie du fichier vers un autre répertoire
cp $FICHIER_ORIGINAL /apps/webservers/dev3/getex/params/creSave/fichier_creMIB-$DATE_DU_JOUR-$HEURE_DU_JOUR 
 
#Récupération du fichier recopié
FICHIER_RECOPIE = "/apps/webservers/dev3/getex/params/creSave/fichier_creMIB-$DATE_DU_JOUR-$HEURE_DU_JOUR"
 
#Substituer les fins de ligne par des espaces
#sed `tr '\n'''` $FICHIER_RECOPIE $FICHIER_RECOPIE
tr '\n' '' $FICHIER_RECOPIE $FICHIER_RECOPIE
 
#Suppression du contenu du fichier
echo > /apps/webservers/dev3/getex/params/cre/fichier_creMIB
J'ai de gros doutes au niveau de la commande cp sur la fin où je concatène avec la date et l'heure!!

Si il y a un problème lors du traitement de la copie ou autre est-ce que le echo sera tout de même exécuté ou pas ?

Et au niveau de la commande sed étant donné que je veux modifier le fichier est-ce possible de diriger la sortie du sed vers le fichier d'origine afin qu'il écrase ou pas ?
benjibul est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/09/2011, 15h55   #6
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 375
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : octobre 2008
Messages : 1 375
Points : 2 034
Points : 2 034
Ton cp a l'air bon.

Non, tu ne peux pas modifier le fichier que tu es en train de lire. Dans ton cas puisque tu as de toute façon besoin de copier le fichier, je te suggère de faire les traitements donc tu as besoin pendant la copie, avec par exemple :
Code :
/usr/bin/tr '\n' '' < $FICHIER_ORIGINAL > $FICHIER_RECOPIE
Dans ce cas tu n'as évidemment plus besoin du cp.
matafan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 16h34   #7
Candidat au titre de Membre du Club
 
Inscription : mai 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 54
Points : 14
Points : 14
Merci pour ton info.

J'ai encore un problème, quand je prends le fichier que je veux traiter sous notepad, en fin de ligne je vois les caractères de saut de ligne : CR LF

Dans mon code j'ai essayer d'enlever \n et aussi \r\n. Cependant, les sauts de ligne sont toujours présents !

Code :
/usr/bin/tr '\r\n' '' < $FICHIER_ORIGINAL > /apps/webservers/dev3/getex/params/creSave/fichier_creMIB-$DATE_DU_JOUR-$HEURE_DU_JOUR
benjibul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 20h14   #8
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par matafan Voir le message
Non, tu ne peux pas modifier le fichier que tu es en train de lire.
Salut

En fait, on peut utiliser une astuce pour lire et modifier un même fichier sans passer par un fichier intermédiaire. Il faut pour cela passer par les canaux numérotés.
On crée un canal numéroté correspondant au fichier à traiter puis on lit ce canal et on redirige le travail dans le fichier à traiter. Exemple:
Code bash :
1
2
3
exec 3<fichier_a_traiter
rm -f fichier_a_traiter
traitement 0<&3 >fichier_a_traiter

Le rm est toutefois obligatoire afin de dissocier, dans le SDF, l'ancien fichier du nouveau fichier. Si on ne le fait pas, la redirection commencera par vider l'ancien fichier. Et le canal n° 3 relié à ce fichier ne contiendra plus rien. C'est donc une procédure "sans filet" (en cas d'interruption malencontreuse du processus, perte totale du fichier quoi). Mis à part ce soucis, aucun pb. J'ai pu gérer de cette façon des fichiers allant jusqu'au G sans perte. Le système tient la charge...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 20h21   #9
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 375
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : octobre 2008
Messages : 1 375
Points : 2 034
Points : 2 034
C'est pratique en effet, mais dans ce cas on n'écrit justement pas dans le fichier qu'on est en train de lire. On écrit dans un nouveau fichier (nouvel inode), qui a le même nom que le fichier qu'on vient d'effacer (mais qui existe toujours sous l'inode original, jusqu'à ce qu'on ferme le fd 3).
matafan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 08h58   #10
Candidat au titre de Membre du Club
 
Inscription : mai 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 54
Points : 14
Points : 14
Merci à tous pour votre aide.
En tout cas mon problème est résolu par la commande suivante pour supprimer les saut de ligne :

Code :
tr -d '\n' < $FICHIER_ORIGINAL > $FICHIER_RECOPIE
benjibul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 08h17   #11
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par matafan Voir le message
C'est pratique en effet, mais dans ce cas on n'écrit justement pas dans le fichier qu'on est en train de lire. On écrit dans un nouveau fichier (nouvel inode), qui a le même nom que le fichier qu'on vient d'effacer (mais qui existe toujours sous l'inode original, jusqu'à ce qu'on ferme le fd 3).
C'est vrai que strictement parlant, ce n'est pas le "même" fichier. Là, je ne peux rien dire.

Toutefois, j'ai aussi une astuce permettant de modifier un "même" fichier. En passant par vi ou ed en ayant redirigé les entrées à partir du script.

Exemple: ouvrir fic, aller en ligne 100, ajouter "coucou"
Code bash :
1
2
3
4
5
vi fic << _EOT_ 1>/dev/null
:100
ocoucou[^ESC
:wq
_EOT_

Bon, c'est lourd, fastidieux, pas pérenne... mais ça fonctionne

Citation:
Envoyé par benjibul Voir le message
Merci à tous pour votre aide.
En tout cas mon problème est résolu par la commande suivante pour supprimer les saut de ligne :

Code :
tr -d '\n' < $FICHIER_ORIGINAL > $FICHIER_RECOPIE
Accessoirement, le echo >$fichier_original est inutile. Tu peux mettre directement >$fichier_original. Ca le vide pareil et ça évite d'appeler une commande "echo" pour rien
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h45.


 
 
 
 
Partenaires

Hébergement Web