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 :

Recherche dans 2 fichiers pour sortie une liste


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Recherche dans 2 fichiers pour sortie une liste
    mon but est de nettoyer le serveur dhcp , j'ai 2 fichiers
    1 qui contient les PC OBSOLETE et de l'autre un fichier qui contient toutes les reservations
    en 1er j' extrait le NUMERO du POSTE du fichier PC.txt
    en 2eme je recherche la reservation sur le fichier DHCP
    quand il y a correspondance cela fonctionne bien mais si il ne trouve pas de POSTE correspondant le script s'arrete

    fichier "PC.txt" qui contient les POSTES a SUPPRIMER
    CN=POSTE12,OU=Fixes,OU=Ordinateurs,OU=Paris,....
    CN=POSTE152,OU=Fixes,OU=Ordinateurs,OU=Paris,....

    ficher "DHCP.txt contient l'export du serveur DHCP
    X.X.X.1 POSTE1 . ADRESSEMAC1
    X.X.X.12 POSTE12 . ADRESSEMAC12
    ...
    X.X.X.152 POSTE152 . ADRESSEMAC152

    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
     
    function recherche {
    DHCPOBSOLETE=`cat /home/sauvegarde/gestion-DHCP/DHCP.txt | grep "$NUMERO"`
    if [ -n "$DHCPOBSOLETE"  ] ; then
    echo "resultat :$DHCPOBSOLETE"
    return
    else
    echo "RIEN DE TROUVE"
    fi
    } 
     
    while read LINE
    do
    NUMERO=`echo $LINE | awk -F"=" {'print $2'} | awk -F"," {'print $1'}`
    echo "recherche sur le numéro : $NUMERO"
    recherche
    done < PC.txt

    une idée ? d'avance merci pour votre aide

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Bon j'ai un peu remanié ton script et chez moi ça marche.

    Juste 2 ou 3 petites trucs :

    Éviter les pipes tant que possible. Plutôt que cat /home/sauvegarde/gestion-DHCP/DHCP.txt | grep "$NUMERO", préférer grep "${NUMERO}" /home/sauvegarde/gestion-DHCP/DHCP.txt. Idem pour "awk", pas la peine de faire un "echo", passer directement la variable grâce à la redirection <<<${variable}.

    Pour "awk", tu peux lui donner plusieurs séparateurs de champs en entrée comme awk -F"[=,]" ce qui évite à nouveau un "pipe"



    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    $ ls
    DHCP.txt  foo.sh*  PC.txt
     
    $ cat DHCP.txt 
    X.X.X.1 POSTE1 . ADRESSEMAC1
    X.X.X.12 POSTE12 . ADRESSEMAC12
    X.X.X.152 POSTE152 . ADRESSEMAC152
    X.X.X.124 POSTE124 . ADRESSEMAC124
     
    $ cat PC.txt 
    CN=POSTE12,OU=Fixes,OU=Ordinateurs,OU=Paris,....
    CN=POSTE152,OU=Fixes,OU=Ordinateurs,OU=Paris,....
    CN=POSTE123,OU=Fixes,OU=Ordinateurs,OU=Paris,....
    CN=POSTE15,OU=Fixes,OU=Ordinateurs,OU=Paris,....
     
     
    $ cat foo.sh 
    #!/bin/bash
     
    function recherche {
    DHCPOBSOLETE=$(grep "${NUMERO}\b" DHCP.txt)
    if [ -n "${DHCPOBSOLETE}"  ] ; then
    echo "resultat : ${DHCPOBSOLETE}"
    echo
    return
    else
    echo "RIEN DE TROUVE"
    echo
    fi
    } 
     
    while read LINE
    do
    NUMERO=$(awk -F"[=,]" '{print $2}' <<<${LINE})
    echo "recherche sur le numéro : ${NUMERO}"
    recherche
    done < PC.txt
     
    $ ./foo.sh 
    recherche sur le numéro : POSTE12
    resultat : X.X.X.12 POSTE12 . ADRESSEMAC12
     
    recherche sur le numéro : POSTE152
    resultat : X.X.X.152 POSTE152 . ADRESSEMAC152
     
    recherche sur le numéro : POSTE123
    RIEN DE TROUVE
     
    recherche sur le numéro : POSTE15
    RIEN DE TROUVE
     
     
    $
    Comme tu peux le voir j'ai modifié l'expression pour le grep en grep "${NUMERO}\b". Sans le "\b" (qui désigne une frontière de mot, autrement dit une limite entre un mot et un caractère non alpha-numérique), le grep va aussi matcher POSTE12, que POSTE120,POSTE121, ..., POSTE129, ..., POSTE1202, etc.

    Exemple :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    $ cat foo.sh 
    #!/bin/bash
     
    function recherche {
    DHCPOBSOLETE=$(grep "${NUMERO}" DHCP.txt)
    if [ -n "${DHCPOBSOLETE}"  ] ; then
    echo "resultat : ${DHCPOBSOLETE}"
    echo
    return
    else
    echo "RIEN DE TROUVE"
    echo
    fi
    } 
     
    while read LINE
    do
    NUMERO=$(awk -F"[=,]" '{print $2}' <<<${LINE})
    echo "recherche sur le numéro : ${NUMERO}"
    recherche
    done < PC.txt
     
    $ ./foo.sh 
    recherche sur le numéro : POSTE12
    resultat : X.X.X.12 POSTE12 . ADRESSEMAC12
    X.X.X.124 POSTE124 . ADRESSEMAC124
     
    recherche sur le numéro : POSTE152
    resultat : X.X.X.152 POSTE152 . ADRESSEMAC152
     
    recherche sur le numéro : POSTE123
    RIEN DE TROUVE
     
    recherche sur le numéro : POSTE15
    resultat : X.X.X.152 POSTE152 . ADRESSEMAC152
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut résolu
    merci pour votre réponse rapide et pleine d'explications

    cela permet de progresser !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 561
    Points : 19 397
    Points
    19 397
    Par défaut
    Bonjour,

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    awk 'BEGIN{
    while( getline <"dhcp.txt" ) dhcp[++n] = $2
    FS="[=,]"
    }
    { for( i in dhcp ){ if( dhcp[i] ~ $2 ){ m++; break}}; if(m) m = 0; else print $2" absent" }' pc.txt
    POSTE123 absent
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci pour la méthode avec awk

    pouvez vous me recommander un document pour découvrir la puissance de awk car je ne

    comprends pas tout !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 561
    Points : 19 397
    Points
    19 397
    Par défaut
    tuto awk
    à la fin du man, il y a l'adresse du Guide de Référence, qui est très bien fait.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/01/2013, 16h39
  2. Réponses: 13
    Dernier message: 09/11/2011, 12h06
  3. Rechercher dans un fichier et copier la liste des fichiers
    Par bigs3232 dans le forum Shell et commandes GNU
    Réponses: 23
    Dernier message: 18/09/2011, 00h36
  4. [Toutes versions] Charger plusieurs xvm dans un fichier modèle via une liste déroulante en vba
    Par eristote dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/08/2011, 09h10
  5. Réponses: 7
    Dernier message: 18/11/2007, 11h38

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