Problème shell. Recherch ds une liste

Fermé
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 - 19 janv. 2009 à 19:11
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 - 30 janv. 2009 à 18:39
Bonjour,
j'utilise le shell.

J'ai une liste m'affichant dans un fichier les utilisateurs du système et leur quotas.
je veux augmenter dans la liste le quota d'un utilisateur donné
J'entre en paramètre d'une fonction l'utilisateur et le no,bre à ajouté.

Mon problème c'est que j'arrive pas rechercher dans la liste l'utilisateur saisi en param. Pouvez vous m'aider un peu.Merci
A voir également:

10 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
19 janv. 2009 à 19:19
Salut,
grep "$1" fichier
Ou "$1" est le premier paramètre (nom utilisateur) et <"ital>fichier</ital>" le fichier contenant la liste.
0
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 2
24 janv. 2009 à 20:20
bonsoir,
toutes mes excuses pr le silence; en fait c'est du à l'instabilité de la connexion chez nous.
Merci pour la comprehension.
je crois que grep ne va pas résoudre le problème.
je le repose.

j'ai un fichier qui est sous cette forme

user 1 1000
user2 2000

je veux modifier la valeur 1000 de user1 par une autre valeur par exemple. Il me faudra chercher la ligne correspondant à l'utilisateur user1. en fait j'entre l'utilisateur(ici user1) en paramètre. et après je dois enregistrer le fichier après avoir modifié la valeur.
Mon problème se situe au niveau de la manière dont je vais rechercher l'utilisateur pour pouvoir modifier sa valeur.
j'ai lu un doc et je crois que sed peut me permettre de résoudre le problème. Mais je n'ai pas encore vu d'exemple et je suis pour le moment planté. Merci de bien vouloir m'aider.
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 895
24 janv. 2009 à 20:34
[tmpfs]$ cat fich
user1 1000
user2 2000
user3 3000
user4 4000
user5 5000

[tmpfs]$ cat foo.sh
#! /bin/sh

#set -xv

sed "/$1/ s/ .*/ $2/" $3

[tmpfs]$ ./foo.sh user2 8000 fich
user1 1000
user2 8000
user3 3000
user4 4000
user5 5000

[tmpfs]$ ./foo.sh user5 2000 fich
user1 1000
user2 2000
user3 3000
user4 4000
user5 2000

[tmpfs]$
Si tu veux que les changements soient permanents, rajoute "-i.bak" à la commande "sed" :
sed -i.bak "/$1/ s/ .*/ $2/" $3
L'option "-i" modifie le fichier sur place, le ".bak" permet de créer une copie du fichier original au cas ou...
0
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 2
24 janv. 2009 à 21:05
merci, je veux comprendre un peu; je suis dans un cybercafé et je n'exécuterai qu'une fois arrivé à la maison; et je n'ai plus accès au net à la maison.
le sed "/$1/ s/ .*/ $2/" $3 recherche $1 et $2 et si il existe $3 si je comprends bien(c 'est a dire les valeurs entrées en paramètre).
alors cette instrucion veut dire quoi svp [tmpfs]$ ./foo.sh user2 8000 fich.
je suppose que foo.sh exécute le script et fich est le fichier à modifier. est ce exact?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 2
24 janv. 2009 à 21:26
rectificatif foo.sh est le fichier exécutant le script
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 895
24 janv. 2009 à 23:33
En fait foo.sh est un script bash qui prend 3 paramètres en entrée :

$1 = le nom de l'utilisateur
$2 = le nouveau quota
$3 = le nom du fichier

ces paramètres sont passés à la commande "sed" (attention de bien entourer la syntaxe de "sed" avec des quotes doubles) et sont interprétés comme suit :

/$1/
Motif recherché (le nom de l'utilisateur)

s/ .*/$2/
On substitue (commande "s") tout ce qui se trouve après un espace et ce jusqu'à la fin de la ligne ( .*) par la valeur du second paramètre ($2)

0
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 2
27 janv. 2009 à 09:33
Bjr Jipicy,

Merci pour ton aide ca fait grandir petit à petit le shell en moi.
la commande sed marche mais il y a encore un petit problème.

En fait le fichier dans lequel je veux faire la modification comporte 3 colonnes. lorsque le sed est appliqué je ne vois plus la valeur existante dans la 3e colonne de la ligne que j'ai modifiée.

Exemple

user1 1000 admin
user2 2000 admin
user3 3000 user
user4 4000 user


si je modifie la ligne de user1 par exemple , j'ai en résultat

user1 6000
user2 2000 admin
user3 3000 user
user4 4000 user

(6000 étant la nouvelle valeur de user1).

j 'au donné en argument à sed 4 paramètres mais ca na pa marché.

Y ' at il une option de sed me permettant de garder la valeur de la 3e colonne?.
Merci.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
27 janv. 2009 à 09:52
Salut,

Essaie
sed "/$1/ s/^.* /$1 $2 /" $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 895
27 janv. 2009 à 10:40
Salut,

Je dirai plutôt :
sed "/$1/ s/ [^ ]*/ $2/" $3
Attention il y a un espace avant le 1er crochet...
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
27 janv. 2009 à 10:43
Salut,

Je n'ai pas des moyens pour tester.

user1 1000 admin

/.* / normalement va avaler tout jusqu'au admin
En ce moment je fait le remplacement de /.* / avec
/$1 $2 /

(admin - la 3ème colonne n'est pas touché normalement)
user1 LE2ARGUMENT admin
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 895 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
27 janv. 2009 à 11:02
Yes, t'as raison, désolé, en voyant ta syntaxe j'ai cru que la regex allait tout avaler ;-[
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
27 janv. 2009 à 12:01
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 895 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
27 janv. 2009 à 12:03
De rien ;-))
0
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 2
30 janv. 2009 à 17:14
bonjour quand j'ai exécuté sed "/$1/ s/^.* /$1 $2 /" $3
j'ai eu comme resulta

user11000 admin
alors j'ai exécuté lea commande de jipicy sed "/$1/ s/ [^ ]*/ $2/" $3
ca a marché.

j voulu amelioré.

alors je donne en paramètre la valeur l'utilisateur une valeur et le fichier mais cette fois ci la valeur entrée en paramètre
ne modifiera plus l'ancienne elle sajoutera à ca. j'ai evidemment réussi l'addition il affiche la nouvelle valeur mais le problème c'est qu'il garde l'ancienne aussi.
je peu recevoir un coup de pouce?
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 895
30 janv. 2009 à 18:06
Affiche ta syntaxe et le résultat escompté, on y verra plus clair ;-))
0
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 2 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
30 janv. 2009 à 18:28
//pour recuperer la valeur correspondant à l'utilisateur saisi en paramètre
//user_quota est le fichier qui renferme les utilisateurs et les valeurs

valeur_ancienne=`cat user_quota | grep $1 | awk '{print $2}'`

valeur_nouvelle=$[$valeur_ancienne + $2] //dans ce cas $2 represente la valeur entrée en paramètre

sed "/$1/ s/ [^ ]*/ $valeur_nouvelle/" $3

supposons k'il a modifié la valeur de user1 ki était à 200 à 600.
il m'affiche dans user_quota

user1 200 600 admin

je ne veux plus avoir les 200. Merci et j'expr ke j'ai un peu expliqué le problème
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 895 > Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009
30 janv. 2009 à 18:32
sed "/$1/ s/$valeur_ancienne/$valeur_nouvelle/" $3
0
Ynsouk Messages postés 104 Date d'inscription mardi 9 octobre 2007 Statut Membre Dernière intervention 6 octobre 2009 2
30 janv. 2009 à 18:39
ok je testerai ca à la mson et je te dirai la reponse 2min.merci
0