Test sur une liste de nom.prenom ds 1 fichier

Fermé
tchobec Messages postés 2 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 25 juillet 2008 - 28 nov. 2007 à 17:08
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 28 nov. 2007 à 20:39
Bonjour,

Je vais essayer de vous exposer clairement ce que je souhaite faire en tant que débutant dans les scripts sous linux.

Je possède un fichier dans lequel sont enregistrés la liste des personnes de mon entreprise sous la forme "nom.prenom" ou "prenom.nom".
Je possède un proxy internet dans lequel chacun possède un compte de connexion sous la forme "nom.prenom:mdp" ou "prenom.nom:mdp" dans un fichier de config.

Je souhaite comparer le contenu de la liste du personnel avec celui du fichier de config du proxy et supprimer dans ce dernier les comptes qui ne sont plus existant dans le premier (afin de supprimer les accès des personnels n'existant plus dans l'entreprise).

Ce que j'ai déjà fais :
Récupération des valeurs de chaque champ et affectation à plusieurs variables avec la commande "read" pour un affichage à l'écran.

#! /bin/sh
while IFS=:"." read nom prenom
do
echo -e "Nom : $nom\n
Prenom : $prenom\n\n"
done </scripts/listecomtpesproxy

Ce que je souhaite faire mais n'y arrive pas en rappelant les variables $nom et $prenom pour chaque ligne lue : Rechercher dans le fichier "listepersonnel" si les comptes existant dans le fichier de "listecomptesproxy" s'y trouvent et supprimer les comptes superflues dans le proxy par rapport au contenu de la liste du personnel.

soit :

si "test" (grep par exemple) de $nom =1
{ si "test" $nom.$prenom =1
l=l+1 (passage à la ligne suivante)
sinon si "test" de $prenom.$nom=1
l=l+1
sinon suppression de la ligne dans "listecomptesproxy" (ou mise en comentaire)
}

J'espère que mon explication est suffisemment clair, j'ai seulement quelques soucis avec les commandes les plus adéquats à choisir pour faire quelque chose d'optimisé.

Merci d'avance pour votre aide.
A voir également:

2 réponses

asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
28 nov. 2007 à 17:55
Bonsoir,

Peut-être que le script suivant t'arrangera:
#!/bin/bash

for ligne in $(cut -f1 -d':' listecomptesproxy ); do
nom=${ligne/.*/}
prenom=${ligne/*./}
cp listecomptesproxy listecomptesproxy.resultat
egrep "$nom.$prenom|$prenom.$nom" listepersonnel >/dev/null 2>&1 || sed -i -e "s/\($nom.$prenom\)/#\1/" -e "s/\($prenom.$nom\)/#\1/" listecomptesproxy.resultat 
done
En gros:
Pour tout les lignes du fichier des comptes du proxy (mot de passe enlevé (cut -f1 -d':' n'affiche que le champ 1 avec comme séarateur de champ le ":")) on assigne la partie de la ligne avant le "." au nom, et la partie aprés le point au prénom.
Si, on trouve nom.prenom ou prenom.nom (le pipe "|" dans egrep signifie OU) dans la liste du personnel on ne fait rien, SINON ("||" en bash) on appel sed et on lui demande de remplacer dans le fichier listecompteproxy.resultat "$nom.$prenom" par "#$nom.$prenom" et "$prenom.$nom" par "#$prenom.nom".

La redirection vers /dev/null (>/dev/null 2>&1) permet de ne pas afficher le resultat de grep (on s'en moque on veut simplement savoir si oui ou non le grep a trouver quelque chose...)

NOTA: je considère que les fichiers sont dédoublonnés, sinon, ça risque de faire des trucs bizarre ;-)


Si tu as besoin de plus d'info sur les commandes utilisées, tu as biensur les man, mais n'hésite pas a redemander dans ce message.

PS: c'est une solution, mais il y en a plein d'autres! ;)

++
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 569
28 nov. 2007 à 20:39
Salut,
$ cat listepersonnel
titi.aaa
tete.ccc
tutu.eee
$ cat listecompteproxy
titi.aaa:jgkjiofgu
toto.bbb:yuyuiyui
tete.ccc:jekj2sdf
tata.ddd:uiouiohjk
tutu.eee:2ds5Adf
$ for i in $(cat listecompteproxy|cut -d':' -f1|comm -2 listepersonnel -);do grep $i listecompteproxy;done
titi.aaa:jgkjiofgu
tete.ccc:jekj2sdf
tutu.eee:2ds5Adf

0