IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[Exercice] Fichiers passwd


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut [Exercice] Fichiers passwd
    Bin quand même, un petit avant de partir une semaine:

    Je veux créer un fichier /etc/passwd à partir de deux autres: Il y a passwd.principal et passwd.secondaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Fichier passwd.principal:
    =========================
    moi:mon-passe-mot:100:100:Moi, c'est moi:/maison/moi:/bin/bash
    toi:ton-passe-mot:101:100:Toi, c'est toi:/appart/toi:/bin/bash
    lui:son-passe-mot:102:100:Lui, c'est lui:/carton/lui:/bin/babash
    eux:leurs-passe-mots:103:100:Eux, c'est pas moi:/lazone/eux:/bin/isariv
    michu:secret:104:100:Mme Michu:/chez/germaine:/bin/quoi
    toit:chaume:105:100:Chapeau maison:/dumonde/toit:/bin/sahalor
     
    Fichier passwd.secondaire:
    ==========================
    elle:son-passe-mot:200:100:Elle, mignonne:/paschezmoi/dommage/elle:/bin/bash
    nous:nos-passe-mots:201:100:On est les meilleurs:/hlm/bleme/nous:/bin/bash
    moi:mon-autre-passe-mot:202:100:Fous la m...:/chateau/espagne:/bin/bash
    vous:vos-passe-mots:203:100:Vous, petes de thunes:/16e/beaux/quartiers:/bin/bash
    S'il y a des noms en double entre les deux fichiers, ce sont ceux de passwd.principal qui ont la priorité: il faut alors supprimer ceux de passwd.secondaire. Et le résultat devra être trié.

    Un bon p'tit script Bash pour nous emballer tout ça, Mame Michu?

  2. #2
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Voila ma contribution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    # copie du fichier pour ne pas le modifier
    cat passwd.secondaire > passwd.final
    for var in $(cut -d: -f1 passwd.principal)
    do
    	grep -q "^$var" passwd.secondaire && sed -i -e "s%$(grep "^$var" passwd.secondaire)%%" -e "/^$/d" passwd.final
    done
    sort --output=passwd.final passwd.principal passwd.final
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 662
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    pas mieux

    nouvelles versions des fichiers passwd principal et secondaire prise en compte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/bin/bash
    
    pass="test/passwd"
    >"${pass}.wrk"
    
    # lire chaque ligne de la concaténation des deux fichiers passwd (principal et secondaire)
    while read line
       do
    # si aucune ligne du fichier temporaire ne commence par le nom d'utilisateur...
          if [ -z "$(egrep "^${line%%:*}" ${pass}.wrk)" ]
             then
                echo "$line" >> "${pass}.wrk"       # ...inscription de la ligne dans le fichier temporaire
          fi
    done < <(cat "${pass}.principal" "${pass}.secondaire")
    
    # trier le fichier temporaire et rediriger le résultat vers passwd
      sort -d -t':' -k1,1 "${pass}.wrk" >"$pass"
    
    # supprimer le fichier temporaire
      rm "${pass}.wrk"
    
    # afficher le fichier passwd
      cat "$pass"
    elle:son-passe-mot:200:100:Elle, mignonne:/paschezmoi/dommage/elle:/bin/bash
    eux:leurs-passe-mots:103:100:Eux, c'est pas moi:/lazone/eux:/bin/isariv
    lui:son-passe-mot:102:100:Lui, c'est lui:/carton/lui:/bin/babash
    michu:secret:104:100:Mme Michu:/chez/germaine:/bin/quoi
    moi:mon-passe-mot:100:100:Moi, c'est moi:/maison/moi:/bin/bash
    nous:nos-passe-mots:201:100:On est les meilleurs:/hlm/bleme/nous:/bin/bash
    toi:ton-passe-mot:101:100:Toi, c'est toi:/appart/toi:/bin/bash
    toit:chaume:105:100:Chapeau maison:/dumonde/toit:/bin/sahalor
    vous:vos-passe-mots:203:100:Vous, petes de thunes:/16e/beaux/quartiers:/bin/bash
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Voici ma solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
    sort -t ':' -k 1,1 passwd.principal | tee passwd.1 | cut -d ':' -f 1 > passwd.2
    sort -t ':' -k 1,1 passwd.secondaire | tee passwd.3 | cut -d ':' -f 1 > passwd.4
    join -t ':' passwd.1 passwd.4 > passwd.5
    join -t ':' -v 1 passwd.1 passwd.4 >> passwd.5
    join -t ':' -v 1 passwd.3 passwd.2 >> passwd.5
    sort -t ':' -k 1,1 passwd.5 > passwd.final
    rm -f passwd.[1-5]
    Edit: Optimisation... grâce au code de winnt qui m'a fait prendre conscience que sort peut trier plusieurs fichiers en une seule fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
     
    sort -t ':' -k 1,1 passwd.principal | tee passwd.1 | cut -d ':' -f 1 > passwd.2
    sort -t ':' -k 1,1 passwd.secondaire > passwd.3
    join -t ':' -v 1 passwd.3 passwd.2 > passwd.4
    sort -t ':' -k 1,1 passwd.1 passwd.4 > passwd.final
    rm -f passwd.[1-4]
    Re-edit: re-optimisation... join peut lire la sortie standard pour une des entréee. Et donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    sort -t ':' -k 1,1 passwd.principal | tee passwd.1 | cut -d ':' -f 1 > passwd.2
    sort -t ':' -k 1,1 passwd.secondaire | join -t ':' -v 1 - passwd.2 > passwd.3
    sort -t ':' -k 1,1 passwd.1 passwd.3 > passwd.final
    rm -f passwd.[1-3]

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Afin de bien être sûr que les scripts fonctionnent correctement, pourriez-vous reprendre les deux fichiers initiaux (j'ai fait une petite erreur hier soir). Je vous mets aussi le fichier qu'il faut obtenir.

    Fichier passwd.principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    moi:mon-passe-mot:100:100:Moi, c'est moi:/maison/moi:/bin/bash
    toi:ton-passe-mot:101:100:Toi, c'est toi:/appart/toi:/bin/bash
    lui:son-passe-mot:102:100:Lui, c'est lui:/carton/lui:/bin/babash
    eux:leurs-passe-mots:103:100:Eux, c'est pas moi:/lazone/eux:/bin/isariv
    michu:secret:104:100:Mme Michu:/chez/germaine:/bin/quoi
    Fichier passwd.secondaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    elle:son-passe-mot:200:100:Elle, mignonne:/paschezmoi/dommage/elle:/bin/bash
    nous:nos-passe-mots:201:100:On est les meilleurs:/hlm/bleme/nous:/bin/bash
    moi:mon-autre-passe-mot:202:100:Fous la m...:/chateau/espagne:/bin/bash
    vous:vos-passe-mots:203:100:Vous, petes de thunes:/16e/beaux/quartiers:/bin/bash
    toit:chaume:105:100:Chapeau maison:/dumonde/toit:/bin/sahalor
    Fichier passwd.final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    elle:son-passe-mot:200:100:Elle, mignonne:/paschezmoi/dommage/elle:/bin/bash
    eux:leurs-passe-mots:103:100:Eux, c'est pas moi:/lazone/eux:/bin/isariv
    lui:son-passe-mot:102:100:Lui, c'est lui:/carton/lui:/bin/babash
    michu:secret:104:100:Mme Michu:/chez/germaine:/bin/quoi
    moi:mon-passe-mot:100:100:Moi, c'est moi:/maison/moi:/bin/bash
    nous:nos-passe-mots:201:100:On est les meilleurs:/hlm/bleme/nous:/bin/bash
    toi:ton-passe-mot:101:100:Toi, c'est toi:/appart/toi:/bin/bash
    toit:chaume:105:100:Chapeau maison:/dumonde/toit:/bin/sahalor
    vous:vos-passe-mots:203:100:Vous, petes de thunes:/16e/beaux/quartiers:/bin/bash

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    awk -F: '{
        if (!($1 in h))
            h[$1] = $0
    }
     
    END {
        n = asorti(h, s)
        for (i=1; i<=n; i++)
            print h[s[i]]
    }' passwd.principal passwd.secondaire

Discussions similaires

  1. Sed et fichier passwd
    Par jmelyn dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/10/2009, 09h08
  2. [Turbo Pascal] Exercice fichier séquentiel
    Par agan2012 dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 07/07/2009, 14h10
  3. fichier PASSWD corrompu
    Par corridea dans le forum Solaris
    Réponses: 1
    Dernier message: 20/03/2008, 23h17
  4. [CVSNT] Pb avec fichier passwd
    Par ego dans le forum CVS
    Réponses: 1
    Dernier message: 28/11/2007, 20h50
  5. Awk - Traiter chaque ligne du fichier passwd
    Par tony montana dans le forum Linux
    Réponses: 7
    Dernier message: 25/03/2004, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo