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

Linux Discussion :

[bash] recherche dans un tableau (array)


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 76
    Points
    76
    Par défaut [bash] recherche dans un tableau (array)
    Bonjour,

    je travail actuellement sur un script BASH me permettant de vérifier le contenu d'un répertoire avec un annuaire.

    pour limiter les ressources utilisées, je stock les infos dans des tableaux.
    par exemple, ARRAY_REP=(`ls /home/`) pour le contenu du répertoire et ARRAY_ANNU=(`ldapsearch -LLL ....`) pour l'annuaire.

    je recherche l'équivalent de "in_array" (Indique si une valeur appartient à un tableau) en PHP.

    Ceci pour éviter de parcourir le 1er tableau et de le comparer ligne à ligne au 2eme.
    par 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
     
    #!/bin/bash
     
    ARRAY_REP=(`ls /home/`)
     
    ARRAY_ANNU=(`ldapsearch -LLL ....`)
    NB=${#ARRAY_ANNU[@]}
     
    for R in ${ARRAY_REP[@]}
    do
         for (( I = 0 ; I < $NB ; I++ ))
         do
              if [ $R = ${ARRAY_ANNU[$I]} ]
                   echo "OK pour $R"
              fi
         done
    done
    dans mon cas j'ai environs 1700 répertoires et 1700 entrées dans l'annuaire.
    ce qui fait un traitement de 2 890 000 un peu trop gourmand à mon gout !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 76
    Points
    76
    Par défaut
    J'ai fais quelques tests.
    vraiment trop gourmant, 100% du CPU pendant une bonne minute: bi xeon 5110(double coeur) 1.6GHz.

    j'ai donc ecrit ceci
    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
    #!/bin/bash
     
    ARRAY_REP=(`ls /home/`)
     
    ARRAY_ANNU=(`ldapsearch -LLL ....`)
    NB=${#ARRAY_ANNU[@]}
     
    for R in ${ARRAY_REP[@]}
    do
         MATCH=(`echo ${ARRAY_USER[@]} |grep "$R"`)
         if [ -z $MATCH ]
         then
              echo 'OK $R'
         fi
    done
    je consomme environs 50% de CPU, c'est un peu mieux.
    mais je ne trouve pas cela très "joli"

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 388
    Points : 23 707
    Points
    23 707
    Par défaut
    Citation Envoyé par sevian Voir le message
    je consomme environs 50% de CPU, c'est un peu mieux.
    mais je ne trouve pas cela très "joli"
    Es-tu sûr que tu consommes vraiment 50% du CPU ou bien ton programme prend-il 100% d'un seul cœur ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 76
    Points
    76
    Par défaut
    En effet,
    après vérification avec autre chose qu'un "top", c'est 100% d'un coeur.
    et pour le 2eme script, c'est 100% aussi, mais réparti sur 2 process.
    surement le "echo |grep" qui fait ca.

    100 % pendant 2min32s pour le 1er script et
    100 % réparti sur 2 process pendant 4min26s pour le 2eme script.

    je ne trouve rien sur le net qui m'indique qu'un in_array existe en bash

    si quelqu'un a une idée, hésitez pas

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 582
    Points : 19 453
    Points
    19 453
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
     
    InArray() {
       [ "$2" = "$1" ] && echo "$2" || {
          [ -n "$3" ] && $FUNCNAME "$1" "${@:3:$#}"
       }
    }
     
    Rep=( $(ls /home/) )
    AnnuR=( $(ldapsearch -LLL ....) )
     
    for i in "${Rep[@]}"
    do InArray "$i" "${Annnu[@]}"
    done
    ...
    ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 76
    Points
    76
    Par défaut
    Merci N_BaH,

    je test ca quand je repasse au bureau, dans 1 semaine.
    je donnerais le temps d'exécution pour comparer.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 76
    Points
    76
    Par défaut
    Me voici de retour au bureau.

    N_BaH, pourrais tu me décrire ce que fait ta fonction, please.

    tu test si le répertoire en cours de traitement est égale au tableau ET tu echo OU ...
    je ne comprends pas la suite.
    vu les premiers tests que j'ai fait avec ta fonction, elle semble gourmande en ressource.

    je cherche a supprimer du /home/personnel/ les répertoires des utilisateurs n'étant pas dans l'annuaire. l'inverse de ta fonction, si je ne dis pas de bêtise.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 582
    Points : 19 453
    Points
    19 453
    Par défaut
    Bonjour sevian,

    voici quelques commentaires :
    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
    #!/bin/bash
     
    InArray() {
    # si ${AnnuR[n]} = ${Rep[n]} =>$i =>$1
       [ "$2" = "$1" ] && {
    # affichage de la valeur équivalente (et sortie implicite de la fonction)
          echo "$2" 
       } || {
    # s'il existe encore un élément dans ${AnnuR[@]}
    # on rappelle la fonction avec $i/$1 et les éléments d'${AnnuR[@]} suivant $2
          [ -n "$3" ] && $FUNCNAME "$1" "${@: 3}"
       }
    }
     
    # création de tableaux
    Rep=( $(ls /home/) )
    AnnuR=( $(ldapsearch -LLL ....) )
     
    # itération du premier tableau
    for i in "${Rep[@]}"
    do InArray "$i" "${AnnuR[@]}"
    done

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 76
    Points
    76
    Par défaut
    Merci

    mais honnêtement, ca me dépasse.
    je vais me replonger dans mes cours et essayer de comprendre, avant de revenir poser mes questions idiotes
    et si vraiment je comprends toujours pas, je me permettrais de demander de l'aide ici.

Discussions similaires

  1. [XL-2010] [VBA ARRAY]Recherche dans un tableau par rapport à une plage
    Par Hugo_pack dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/07/2014, 18h00
  2. Rechercher valeur Mini dans variable tableau (array)
    Par jojo86 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 16/07/2013, 20h03
  3. Uilisiser un Array pour une recherche dans un tableau
    Par AmauryLondon dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/06/2012, 17h52
  4. Réponses: 6
    Dernier message: 02/06/2007, 17h02
  5. URGENt: recherche dans un tableau trié par ordre alphabetiqu
    Par JulPop dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/02/2005, 17h21

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