script de recherche

script de recherche - Linux et OS Alternatifs

Marsh Posté le 11-05-2005 à 09:16:51    

salut , j'aimerais faire une recherche d'un utilisateur dans un fichier de config et lui définir un quota s'il n'existe pas ou lui changer son quota s'il existe
 
ex:  
user1 15000
user2 12000
 
set_quota user3 8000
-> user1 15000
   user2 12000
   user3 8000
 
set_quota user1 9000
-> user1 9000
   user2 12000
   user3 8000
 
comment faire ?

Reply

Marsh Posté le 11-05-2005 à 09:16:51   

Reply

Marsh Posté le 11-05-2005 à 09:27:47    

en awk un script dans ce style:

Code :
  1. {
  2. if ($1==user_a_modifier)
  3. {
  4. printf "%s %i\n",$1,valeur_quota;
  5. }
  6. else
  7. print $0;
  8. }


 
on le sauvegarde dans un fichier set_quota.awk
 
comment l'appeler :
awk -f 'set_quota.awk' -v user_a_modifier='<le user>' -v valeur_quota='<le quota>' <le fichier contenant les quotas et users>   > <le fichier contenant la modification>
 
ex:
awk -f 'set_quota.awk' -v user_a_modifier='user1' -v valeur_quota='1000' <le fichier contenant les quotas et users> > fichier_config_modifier
 
Edit : appel du script


Message édité par jlighty le 11-05-2005 à 10:00:51
Reply

Marsh Posté le 11-05-2005 à 10:14:21    

oui ça marche si l'utilisateur existe mais s'il n'existe pas il ne me crée pas l'utilisateur

Reply

Marsh Posté le 11-05-2005 à 10:17:11    

bon on va aranger ça

Code :
  1. BEGIN { new_user=1}
  2.   {
  3.     if ($1==user_a_modifier) 
  4.      {
  5.        new_user=0;
  6.      printf "%s %i\n",$1,valeur_quota;
  7.      }
  8.     else
  9.      print $0;
  10.  
  11.   }
  12. END {if (new_user==1)
  13. printf "%s %i\n",user_a_modifier,valeur_quota; }


Message édité par jlighty le 11-05-2005 à 12:26:58
Reply

Marsh Posté le 11-05-2005 à 10:22:42    

c'est quoi les étoiles avant chaque instruction ?  
je l'ai enlevé sinon ça s'execute pas  
 
mais il m'ajoute l'utilisateur en fin de fichier même si l'utilisateur existe deja

Reply

Marsh Posté le 11-05-2005 à 10:24:39    

si c'est bon , une erreur dans mon script , merci ça marche

Reply

Marsh Posté le 11-05-2005 à 10:24:48    

j'ai fais quelques corrections ew_user -> new_user et j'ai retiré les étoiles


Message édité par jlighty le 11-05-2005 à 10:25:03
Reply

Marsh Posté le 11-05-2005 à 10:28:31    

BEGIN ... END , c'est interpreté comment par awk ?

Reply

Marsh Posté le 11-05-2005 à 10:30:22    

BEGIN est exécuté avant tout traitement sur les chaines, END à la fin. Voir la doc gawk pour plus d'infos.


---------------
"The marketing guys said the HP-35 would be a failure because it was too small, and then we couldn't make them fast enough to meet the demand. The marketing folks don't know everything." - Bill Hewlett
Reply

Marsh Posté le 11-05-2005 à 10:30:39    

BEGIN : exécute des instructions dès le lancement du script
END : exécute des instructions à la fin du script
toutes les infos dans man awk

Reply

Marsh Posté le 11-05-2005 à 10:30:39   

Reply

Marsh Posté le 11-05-2005 à 10:34:09    

il manque juste le % avant le s dans le printf et c'est bon
 
un vrai langage de programmation à lui tout seul ce awk


Message édité par slash51 le 11-05-2005 à 10:35:29
Reply

Marsh Posté le 11-05-2005 à 10:35:23    

:ange: oui j'ai tapé un peu trop vite


Message édité par jlighty le 11-05-2005 à 10:35:32
Reply

Marsh Posté le 11-05-2005 à 10:41:23    

awk, ça traite des millions de lignes en quelques secondes. C'est réellement impressionnant, on devrait tous apprendre à s'en servir.


---------------
"The marketing guys said the HP-35 would be a failure because it was too small, and then we couldn't make them fast enough to meet the demand. The marketing folks don't know everything." - Bill Hewlett
Reply

Marsh Posté le 11-05-2005 à 10:54:10    

c'est normal que si <le fichier contenant les quotas et users> et fichier_config_modifier est le même je me retrouve plus qu'avec une seule ligne dans le fichier modifié  
 
j'ai fait :  
 
awk -f 'set_quota.awk' -v user_a_modifier='user1' -v valeur_quota='1000' quotas.txt > quotas.txt  
 

Reply

Marsh Posté le 11-05-2005 à 10:56:38    

il ne faut surtout pas que les noms soient identiques !
pourquoi ?
awk traite ton fichier ligne par ligne, à chaque ligne il retourne les modifications
 
tu n'as quà faire ça :
awk -f 'set_quota.awk' -v user_a_modifier='user1' -v valeur_quota='1000' quotas.txt > quotas_modifier.txt ; mv -f quotas_modifier.txt quotas.txt  


Message édité par jlighty le 11-05-2005 à 10:58:02
Reply

Marsh Posté le 11-05-2005 à 10:59:13    

Et tu peux même remplacer le dernier ; par un &


---------------
"The marketing guys said the HP-35 would be a failure because it was too small, and then we couldn't make them fast enough to meet the demand. The marketing folks don't know everything." - Bill Hewlett
Reply

Marsh Posté le 11-05-2005 à 10:59:54    

:D  pour que ça soit encore mieux un && comme ça si le script plante, il n'écrasera pas le fichier original


Message édité par jlighty le 11-05-2005 à 11:00:13
Reply

Marsh Posté le 11-05-2005 à 11:01:01    

Je vais plus loin, et j'invente le &&& ! Aucune idée de ce que ça peut bien faire, mais c'est moi qui ai la plus grosse \o/


---------------
"The marketing guys said the HP-35 would be a failure because it was too small, and then we couldn't make them fast enough to meet the demand. The marketing folks don't know everything." - Bill Hewlett
Reply

Marsh Posté le 11-05-2005 à 14:06:45    

et pour faire une recherche dans ce même fichier alors ?
 
si je veux afficher le quota de user2 s'il existe
et afficher "quota introuvable" s'il l'utilisateur n'existe pas  

Reply

Marsh Posté le 11-05-2005 à 14:16:11    

# pas très compliqué surtout  :ange:  

Code :
  1. quota=`cat <ton fichier> | fgrep <user> | awk '{print $2 }'`
  2. if [ -z "$quota" ]; then
  3. echo "quota introuvable"
  4. else
  5. echo "$quota"
  6. fi


Message édité par jlighty le 11-05-2005 à 14:41:13
Reply

Marsh Posté le 11-05-2005 à 14:26:28    

il me dit line1 :<mon fichier> : command not found
 
de plus , fgrep ne fait pas une recherche exact il me semble
si j'ai user 1000 et user2 2000
et que je fais un fgrep user
il va m'afficher 1000 et 2000

Reply

Marsh Posté le 11-05-2005 à 14:31:41    

quota=cat <ton fichier> | fgrep <user> | awk '{print $2 }'
 
Il faut plutôt faire:
quota=`cat <ton fichier> | fgrep <user> | awk '{print $2 }'`

Reply

Marsh Posté le 11-05-2005 à 14:32:38    

et si tu fais fgrep "user " (à moins qu'il y ait des espaces dans le nom ce qui n'est pas trop unix-friendly)
<mon fichier> doit être remplacé par le chemin complet du fichier


Message édité par jlighty le 11-05-2005 à 14:38:23
Reply

Marsh Posté le 11-05-2005 à 14:33:37    

Citation :

quota=`cat <ton fichier> | fgrep <user> | awk '{print $2 }'`


oubli des guillemets  :ange:

Reply

Marsh Posté le 11-05-2005 à 14:40:17    

c'est bien ce qui me semblait le fgrep ne fait pas une recherche exacte  
pour user 1000
     user2 2000
     tempuser 3000
 
j'obtiens 1000  
          2000
          3000
il prend tous les noms qui contiennent user


Message édité par slash51 le 11-05-2005 à 14:41:49
Reply

Marsh Posté le 11-05-2005 à 14:43:36    

en awk:

Code :
  1. BEGIN{user_trouve=0 }
  2. {
  3. if ($1==user_a_analyser)
  4. {
  5.    user_trouve=1;
  6.    print $2;
  7. }
  8. }
  9. END {
  10. if (user_trouve==0)
  11. print "quota introuvable"
  12. }


appel :
awk -f 'find_quota.awk' -v user_a_analyser='user1'  quotas.txt  


Message édité par jlighty le 11-05-2005 à 14:45:46
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed