2010-12-05 7 views
1

Je veux écrire un script pour vérifier les doublons Par exemple: J'ai un fichier texte contenant des informations dans le format du fichier/etc/passwdVérifiez si une chaîne particulière est dans un fichier bash

alice:x:1008:555:William Williams:/home/bill:/bin/bash 
bob:x:1018:588:Bobs Boos:/home/bob:/bin/bash 
bob:x:1019:528:Robt Ross:/home/bob:/bin/bash 
james:x:1012:518:Tilly James:/home/bob:/bin/bash 

I vouloir simplement vérifier s'il y a des utilisateurs en double et s'il y a, afficher la ligne en erreur standard. Ainsi, dans l'exemple ci-dessus puisque bob apparaît deux fois ma sortie serait tout simplement générer quelque chose comme:

Error duplicate user 
bob:x:1018:588:Bobs Boos:/home/bob:/bin/bash 
bob:x:1019:528:Robt Ross:/home/bob:/bin/bash 

En ce moment j'ai une boucle while qui lit chaque ligne et stocke chaque élément d'information dans une variable en utilisant -F awk qui est délimité par ":". Après avoir stocké mon nom d'utilisateur, je ne suis pas sûr de la meilleure approche pour vérifier si elle existe déjà.

Certaines parties de mon code:

while read line; do 
     echo $line 
     user=`echo $line | awk -F : '{print $1}'` 
     match=`grep $user $1`($1 is the txtfile) 
     if [ $? -ne 0 ]; then 
       echo "Unique user" 
     else 
       echo "Not unique user" 
       then somehow grep those lines and output it 
     fi 
done 

La mise en correspondance ne produit pas les bons résultats
Suggestions?

+0

'grep' renvoie uniquement un code de sortie non nulle quand il y a *aucune concordance. –

Répondre

4

au lieu de réinventer la roue, utilisez les outils suivants:

  • cut pour extraire premier champ
  • sort et uniq pour ne garder que les lignes dupliquées.

    cut -d : -f 1 | sort | uniq -d | while read i ; do 
                echo "error: duplicate user $i" 
               done 
    
0

Sons comme un travail pour awk me:

% awk -F':' ' 
/:/ { 
    count[$1] += 1 
} 

END { 
    for (user in count) { 
     if (count[user] > 1) { 
      print user " appears in the file " count[user] " times." 
     } 
    } 
} 
' /etc/passwd 
0

perl-proposition:

perl -F: -lanE 'push @{$h{$F[0]}},$_; END{for $k (keys %h){if(@{$h{$k}}>1){say "Error";say for @{$h{$k}}}}}' file 
+0

Une de-obfuscation pour les non-moines serait la bienvenue s'il vous plaît :-) – Benoit

Questions connexes