Recherche d'une valeur absolut et non relativ

bheadman Messages postés 105 Statut Membre -  
bheadman Messages postés 105 Statut Membre -
Bonjour,

Bon pour commencer ce que j'entends par valeur absolu/relative

Absolu :
Si je cherche toto dans un fichier je veux trouver "toto" et pas les ligne "toto32" "totomobile" "*toto*"

relative :
l'inverse de au-dessus :D

Donc voila le but de la maneuvre est de supprimer des users dans /etc/passwd ainsi que dans un autre fichier utilisant le même "login" (si passwd contiens ndupont:x:.... l'autre fichier contiens ndupont|info1|info2|...).
Mais le problème c'est que ces fichiers contiennent des "doublons renommés" :
si "ndupont" existe en double alors le 2ème s'appelle "ndupont2" (exemple : nicolas dupont et natalie dupont = ndupont).

Donc si je veux supprimer ndupont et pas ndupont2 je suis bloqué.

voici mon script actuellement :

# cat supp.sh
#!/bin/sh
####
# Definition des variables
####

User_Liste=`cat ./liste.txt`
Now=`date +%y%m%d-%H%M`

####
#Sauvegarde des fichier d'origine pour archivage
####

cp -f /Nicolas_test/passwd /Nicolas_test/passwd.bak.${Now}
cp -f /Nicolas_test/aut_base /Nicolas_test/aut_base.bak.${Now}

####
# Debut de la suppression des compte
####

for User in ${User_Liste}
do
sed '/'"${User}"':/d' /Nicolas_test/passwd > /Nicolas_test/passwd_temp
sed '/'"${User}"'\|/d' /Nicolas_test/aut_base > /Nicolas_test/aut_base_temp
mv -f /Nicolas_test/passwd_temp /Nicolas_test/passwd
mv -f /Nicolas_test/aut_base_temp /Nicolas_test/aut_base
done

####
#fin
####

Pour info je suis bloqué sur un vieux système unix et je n'ai que du "sh" sous la main. (pour exemple le sed que j'utilise ne connais même pas l'option "-i" ce qui m'oblige à faire tout ce mic-mac de fichier temp et de copie)

Je suis ouvert à toute proposition et reste à votre disposition en cas de question.

Cordialement.
BHeaDMaN (Nicolas :D)
Configuration: Windows XP
Firefox 3.0

2 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    dans /etc/passwd rechercher ^ndupont: pour ne trouver que l'utilisateur ndupont
    je n'ai pas bien compris le format du 2ème fichier
    0
    1. bheadman Messages postés 105 Statut Membre 1
       
      le 2ème fichier la sytaxe est la suivante :
      ndupont|local|nom_server|base

      Avec un pipe " | " comme séparateur et je le protège avec un "\" pour qu"il ne soit pas interprété mais pris en compte comme un simple caratère
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Il te faut regarder du côté des expressions régulières matchant une limite de mots (man grep) :
    [tmpfs]$ cat fichier.txt
    ndupont:x:501:501:blabla:bla:/bin/bash
    ndupont2:x:501:501:blabla:bla:/bin/bash
    nbondupont:x:501:501:blabla:bla:/bin/bash
    ndupontel:x:501:501:blabla:bla:/bin/bash
    ndupont3:x:501:501:blabla:bla:/bin/bash
    
    [tmpfs]$ grep 'ndupont' fichier.txt
    ndupont:x:501:501:blabla:bla:/bin/bash
    ndupont2:x:501:501:blabla:bla:/bin/bash
    nbondupont:x:501:501:blabla:bla:/bin/bash
    ndupontel:x:501:501:blabla:bla:/bin/bash
    ndupont3:x:501:501:blabla:bla:/bin/bash
    
    [tmpfs]$ grep 'ndupont\b' fichier.txt
    ndupont:x:501:501:blabla:bla:/bin/bash
    nbondupont:x:501:501:blabla:bla:/bin/bash
    
    [tmpfs]$ grep '\bndupont\b' fichier.txt
    ndupont:x:501:501:blabla:bla:/bin/bash
    
    [tmpfs]$  
    sed utilise la même syntaxe, par contre il faut voir en fonction de la version...
    [tmpfs]$ sed -n '/ndupont/p' fichier.txt
    ndupont:x:501:501:blabla:bla:/bin/bash
    ndupont2:x:501:501:blabla:bla:/bin/bash
    nbondupont:x:501:501:blabla:bla:/bin/bash
    ndupontel:x:501:501:blabla:bla:/bin/bash
    ndupont3:x:501:501:blabla:bla:/bin/bash
    
    [tmpfs]$ sed -n '/ndupont\b/p' fichier.txt
    ndupont:x:501:501:blabla:bla:/bin/bash
    nbondupont:x:501:501:blabla:bla:/bin/bash
    
    [tmpfs]$ sed -n '/\bndupont\b/p' fichier.txt
    ndupont:x:501:501:blabla:bla:/bin/bash
    
    [tmpfs]$

    0
    1. bheadman Messages postés 105 Statut Membre 1
       
      Merci,

      C'est plus "propre" que ma version qui ressemble à cela :

      sed '/ ^ '"${User}"' : /d' ${File_Login}/passwd > ${File_Login}/passwd_temp

      qui consiste à ne demander que les regexp en début de ligne et qui sont immédiatement suivit de 2 point
      0