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 :

aide sur comparaison et condition en shell


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    Par défaut aide sur comparaison et condition en shell
    Bonjour,

    Voici mon probleme:
    C'est de la programmation shell sous linux redhat 5 ES.
    A la base il y a 2 fichiers param_user et param_carac. Et un script en shell, qui une fois exécuté, collectera des infos du 1er et 2eme fichiers et les mettra en sortie dans un fichier passwd.

    # param_user contient les lignes ecrit comme ceci = login:Id:groupe_service (7 groupes services total)
    exemple = toto:900:admin , seulement 3 colonnes par lignes

    # param_carac contient Id:groupe_archi:groupe_service:etc ...
    ou groupe_service:group_archi: etc ...
    //il n'y a que 3 groupe architecture A , B et C
    // il peut y avoir 6 colonnes max
    // autant de ligne que d'utilisateur (50)
    exemple = 800:A:admin:etc...
    500:B:reseau:etc...
    223:A:etude:etc...
    900:A:admin:etc...
    500:C:admin:etc...
    admin:C:etc...
    etude:B:etc...


    lorsque que j'executerai le script ./script toto group_service
    exemple (et seulement de cette maniere ci, avec 2 arguments)
    ==> ./script toto admin
    reprenons maintenant les exemples comme énoncés.

    Le programme doit chercher l'Id (donc 900, id de toto) dans le premier fichier param_user et le compare avec les id du 2eme fichier param_carac.

    # etape 1 :Si c'est le meme id, on copie la ligne du fichier param_carac où l'Id a été trouvé et on le renvoie dans un fichier nommé passwd

    # etape 2 : si il ne le trouve pas le meme id, on compare désormais le groupe_service du user situé dans param_user donc ici admin et effectuer le meme procédé que l'étape 1


    Pouvez vous me donner les idées de départ ? pour que je puisse effectuer le programme .
    je ne vois pas comment 1) associer toto à l'id, faut il que toto et id soit dans la meme ligne ?
    2) étape 1 comparer $1(entrer en paramètre) à une donnée d'un fichier
    3) étape 2 comparer $2(entrer en paramètre) apres avoir montrer que étape 1 ne donnait rien
    4) probleme se situant au niveau de la comparaison en shell

    je vois comment -le renvoyer dans un fichier >> passwd
    -choisir une ligne avec colonne grep nom |-d ":" -f1
    - effectuer une boucle if

    merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77 Voir le message
    Bonjour,

    Voici mon probleme:
    C'est de la programmation shell sous linux redhat 5 ES.
    A la base il y a 2 fichiers param_user et param_carac. Et un script en shell, qui une fois exécuté, collectera des infos du 1er et 2eme fichiers et les mettra en sortie dans un fichier passwd.

    # param_user contient les lignes ecrit comme ceci = login:Id:groupe_service (7 groupes services total)
    exemple = toto:900:admin , seulement 3 colonnes par lignes

    # param_carac contient Id:groupe_archi:groupe_service:etc ...
    ou groupe_service:group_archi: etc ...
    //il n'y a que 3 groupe architecture A , B et C
    // il peut y avoir 6 colonnes max
    // autant de ligne que d'utilisateur (50)
    exemple = 800:A:admin:etc...
    500:B:reseau:etc...
    223:A:etude:etc...
    900:A:admin:etc...
    500:C:admin:etc...
    admin:C:etc...
    etude:B:etc...


    lorsque que j'executerai le script ./script toto group_service
    exemple (et seulement de cette maniere ci, avec 2 arguments)
    ==> ./script toto admin
    reprenons maintenant les exemples comme énoncés.

    Le programme doit chercher l'Id (donc 900, id de toto) dans le premier fichier param_user et le compare avec les id du 2eme fichier param_carac.

    # etape 1 :Si c'est le meme id, on copie la ligne du fichier param_carac où l'Id a été trouvé et on le renvoie dans un fichier nommé passwd

    # etape 2 : si il ne le trouve pas le meme id, on compare désormais le groupe_service du user situé dans param_user donc ici admin et effectuer le meme procédé que l'étape 1


    Pouvez vous me donner les idées de départ ? pour que je puisse effectuer le programme .
    je ne vois pas comment 1) associer toto à l'id, faut il que toto et id soit dans la meme ligne ?
    2) étape 1 comparer $1(entrer en paramètre) à une donnée d'un fichier
    3) étape 2 comparer $2(entrer en paramètre) apres avoir montrer que étape 1 ne donnait rien
    4) probleme se situant au niveau de la comparaison en shell

    je vois comment -le renvoyer dans un fichier >> passwd
    -choisir une ligne avec colonne grep nom |-d ":" -f1
    - effectuer une boucle if

    merci de votre aide
    C'est marrant ! C'est le genre de truc que je donne à mes élèves quand je donne des cours shell

    Bon, idées de départ
    grep "machin" fichier => te donne la (ou les) lignes de "fichier" contenant "machin" ou <rien> s'il n'a pas trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    info=`grep "^toto:" param_user`
    if test -n "$info"
    then
         # Trouvé
         ...
    else
         # Pas trouvé
         ...
    fi
    Extraire un champ d'une info => echo $info |cut...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id=`echo "$info" |cut -f2 -d:`

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    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
    15
    16
    17
    18
    19
    # en executan ./script toto
    #voici le programme pour la 1ere étape,qui cherche l'id 
    #par rapport au nom taper en paramètre
     
    #!/bin/bash
     
    info=`grep "^$1:" param_user`
    if test -n "$info"
    then
        id=`echo "$info" |cut -f2 -d ":"`
        echo "$info" ...?
     # maintenant il faut comparé cette id avec les id présents dans le fichier param_carac
     # si c'est le meme, on copie la ligne où l'id se trouve (donc dans param_carac)
     # et le rediriger vers fichier passwd
    # sinon on passe à létape 2 qu'on verra plus tard, une fois ce pb résolu.
    else
         echo "login inexistant"
     
    fi
    une idée de début pour comparer un mot avec un autre?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    info=`grep "^$1:" param_user`
    if test -n "$info"
    then
        id=`echo "$info" |cut -f2 -d ":"`
    #   if [ "$id" = "id du fichier param_carac"] 
    #    then
    #    echo "la ligne dont l'id est contenu " >> passwd
     else
         echo "login inexistant"
     
    fi
    je n'arrive pas a faire ce qui est écrit, j'ai éssayé avec les grep et find
    mais il ne compare pas si c'est égale, il affiche les 2 Id ds passwd ...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    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
    15
    #!/bin/bash
     
    info=`grep "^$1:" param_user`
    if test -n "$info"
    then
        id=`echo "$info" |cut -f2 -d ":"`
        c=`grep "id" param_carac`
        if [ "$id" = "$c" ] 
        then
        echo "$c" >>passwd
        fi
    else
         echo "login inexistant"
     
    fi
    Il n'y a rien dans passwd une fois le script executé ./script toto
    pourtant toto est bien dans param_user et param_carac ...

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77 Voir le message
    une idée de début pour comparer un mot avec un autre?
    Oui. Te faut d'abord récupérer cet autre mot (par exemple dans la variable "id_autre"). Tu as su récupérer ton 1er mot avec grep et cut, tu sauras récupérer le 2° de la même façon.

    Ensuite, la comparaison est très simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if test "$id" = "$id_autre"
    then
        ...
    else
        ...
    fi
    Mais il me semble que t'as pas besoin de comparer ton id avec celui contenu dans param_carac. Tu as récupéré un id dans la variable "$id", il te suffit d'utiliser cet id dans un grep que tu feras sur param_carac => tu récupèreras toute la ligne correspondante...

    Conseil1: en shell, faut jamais vouloir aller trop vite et vouloir tout faire en une instruction. On n'est pas en C. Il te faut découper chaque problème en opérations vraiment élémentaires qui pourra ensuite être faite par une commande simple (comme je t'ai montré pour le grep et le cut)...

    Conseil2: avant de mettre un ensemble de commandes dans un script, teste-les une par une pour voir ce que ça fait et comprendre son fonctionnement. Je te dis de faire un "grep" alors pars directement en ligne de commande et tape directement ton "grep ...". Une fois que t'auras la bonne syntaxe, que le résultat sera conforme à ce que tu cherches, ben tu mets ta commande dans le script...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    Par défaut enfin ! mais encore souci
    Apres avoir testé, réessayer, exécuté de nombreuses fois , ca marche !
    mais le souci c'est le contenu du fichier passwd. Une fois les 2 lignes détécter et copier dans le fichier, elles apparaissent comme ceci :

    toto:800:admin
    800:trt:/home/test

    je voudrais qu'elles soient en une seul ligne mais je ne trouve pas
    pourtant "$d $p " >>passwd devrait les mettre en ligne ?
    remarque : ce n'est pas grave si l'ID apparait 2 fois ou autre donnée redondantes, car pour la suite de mon programme j'effacerai le fichier.

    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
    ./script toto 
     
    #!/bin/bash
    If  [  $# -ne 1 ] ; then
    	Echo  “Usage : $0  [nom] [service]”;
    Exit 2 ;
    fi
     
     
    // Etape 1 : chercher si login existe dans param_user, si oui on stock la ligne dans passwd et passe etape 2
    					      Si non login inexistant
     
    P=`grep –c “^$1:” param_user`
     
    If [$p” =  “1]
     
    Then 
           P=`cat param_user | grep ^$1: ` 	// une fois trouvé on garde la ligne A
     
    // Etape 2 : cherche à  comparer l’id de toto dans param_user au fichier param_carac
    Si identique, on copie la ligne du fichier param_carac et  on met dans >>passwd
    Si non on compare désormais le service (dev) et effectue etape 2
     
    	info=`grep "^$1:" param_user` 		// cherche login dans param_user
    	if test -n "$info"
    	then
    		id=`echo "$info" | cut -f2 -d ":"` //cherche l’id se trouvant dans la ligne param_user
    		c=`grep -c "$id" param_carac` // on prend la ligne la ligne où se trouve l’id dans le fichier 								param_carac
     
    		if [ "$c" = "1" ] 
    		then
    			c=`grep "$id" param_carac `
    			echo « $p : $c »  >>passwd
     
    		fi
     
     
    Else
           Echo “erreur ! cet utilisateur est inexistant”
    fi

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77 Voir le message
    je voudrais qu'elles soient en une seul ligne mais je ne trouve pas pourtant "$d $p " >>passwd devrait les mettre en ligne ?
    Exact. Cela signifie donc que ta variable "$p" ou "$c" est elle-même constituée de 2 lignes.
    Pour le vérifier, affiche donc "[$p] [$c]" (avec les crochets qui te montreront où commence et où finit chaque variable...

    Citation Envoyé par monsieur77 Voir le message
    remarque : ce n'est pas grave si l'ID apparait 2 fois ou autre donnée redondantes, car pour la suite de mon programme j'effacerai le fichier.
    Certes... mais c'est toujours dommage de ne pas se préoccuper d'un bug aussi minime soit-il...

    Citation Envoyé par monsieur77 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    p=`grep –c “^$1:” param_user`
    if [$p” =  “1]
    then 
           P=`cat param_user | grep "^$1:" `
    C'est dommage que tu fasses 2 grep quasiment identique pour chaque action (une fois pour vérifier, une 2° fois pour récupérer) car tu peux récupérer et vérifier en même temps (style si t'as rien récupéré c'est que l'info n'y est pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    P=`grep "^$1:" param_user`
    if [ -n "$p" ]
    then 
           # Pas besoin ici de refaire "grep" puisque "p" est déjà rempli...
    else
           # Ici, "p" est vide donc l'argument "$1" n'est pas dans "param_user"
    fi
    Dernier détail, mettre des variables au nom si peu significatif ($p, $c) n'est pas une bonne idée => au fur et à mesure que t'avances dans ton programme, tu risques de perdre (dans ta tête) le but et le contenu de tes variables. Force-toi, quand tu veux créer une variable, à te dire "à quoi va-t-elle servir ? Stocker une ligne ? Un nom ? Un compteur ?" et mettre des noms appropriés "$lig, $nom, $cpt".
    C'est un petit effort minime à faire mais il te permettra ensuite d'avancer 2 fois plus vite dans l'écriture de ton code (tu perdras pas de temps à te dire "à quoi sert p déjà ?") et évitera les bugs (recréer une 2° variable parce que t'as oublié que l'info était déjà stockée dans une 1ère et avoir donc au final 2 infos identiques dans 2 variables différentes avec le risque de voir les infos diverger au fur et à mesure que t'écris ton code)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    Par défaut
    Merci sve@r pour tes conseils, je les respecterai à l'avenir.
    autre question :

    Quand j’exécute le script ./script toto reseau
    Le 2eme paramètre ne peut contenir que reseau, admin , dev et etude
    Si l’on tape autre chose ca indiquera une erreur comme « service inexistant »
    Donc pour cela je pensais déclarer la variable $2 avec seulement les 4 services existants
    Le problème c’est que je ne vois pas comment définir ca.
    J'ai deja mis au debut de mon programme :
    If [ $# -ne 2 ] ; then
    Echo “Usage : $0 [nom] [service]”;
    Exit 2 ;
    fi
    // qui signifie que si l'on tape en paramètre 1 seul arguments , le message d'erreur apparaitra, alors qu'il en faut 2 mais pour mon probleme je ne vois pas apres recherches.
    j'ai essayé $2 = admin reseau dev etude sans succes ...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    Par défaut
    autre question dont je recherche la reponse

    comment eviter les doublons dans un fichier
    suite à la remarque de sve@r je tente d'enlever les doublons de mon fichier passwd, il y a plusieurs mots identiques.
    avez vous une ligne de programme à me conseiller afin que je le rajoute dans mon programme lors de la redirection

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77
    J'ai deja mis au debut de mon programme :
    If [ $# -ne 2 ] ; then
    Echo “Usage : $0 [nom] [service]”;
    Exit 2 ;
    fi
    // qui signifie que si l'on tape en paramètre 1 seul arguments , le message d'erreur apparaitra
    Exact. 1 seul ou même 0. Tu testes si le nb d'arguments n'est pas égal à 2. C'est ainsi qu'on fait d'habitude (sauf qu'on préfère tester si le nb d'arguments est plus petit que 2 ce qui permet à l'utilisateur d'en entrer 36 s'il a envie tout en sachant bien que seul les 2 premiers seront pris en compte)

    Citation Envoyé par monsieur77
    j'ai essayé $2 = admin reseau dev etude sans succes ...
    Hé non. Le shell n'est pas aussi intelligent. Il ne peut comparer les choses que une avec une autre.
    Donc il te faut programmer l'algorithme de vérification à partir des éléments que t'offre le shell

    1) les connecteurs "and/or" (dans ton cas ce sera du "and"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if test "$2" != "admin" -a "$2" != "reseau" -a "$2" != "dev" -a "$2" != "etude"
    then
        echo "$2 pas correct"
    fi
    Attention à la loi de De Morgan
    Not (a ou b) = not a et not b
    Tu veux que $2 soit égal à admin ou réseau => tu refuses si $2 différent de admin et réseau

    2) le case
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case $2 in
         "admin");;
          "reseau");;
          "dev");;
          "etude");;
           *) echo "$2 incorrect"
    esac
    3) la recherche d'un élément dans une liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for elem in admin reseau dev etude
    do
          if test "$2" = "$elem"
          then
               ok="ok"
               break
          fi
    done
     
    if test -z "$ok"
    then
         echo "$2 incorrect"
    fi
    4) utiliser le "grep" (après-tout, tu l'as utilisé de partout pour trouver une info dans un fichier, tu aurais pu l'utiliser ici pour trouver $2 dans ta liste)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo admin reseau dev etude |grep "$2" 1>/dev/null
    if test $? -ne 0
    then
        echo "$2 incorrect"
    fi
    C'est ça l'algorithmie. Arriver à décomposer un problème (trouver un mot dans une liste) en éléments assez petits pour être traduits en instructions élémentaires du langage...

    Citation Envoyé par monsieur77 Voir le message
    autre question dont je recherche la reponse

    comment eviter les doublons dans un fichier
    suite à la remarque de sve@r je tente d'enlever les doublons de mon fichier passwd, il y a plusieurs mots identiques.
    avez vous une ligne de programme à me conseiller afin que je le rajoute dans mon programme lors de la redirection
    Ben tu évites de créer ces doublons pendant le traitement (grep te permet de voir si une info est présente donc si ce que tu veux écrire est déjà présent tu l'écris pas)...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    Par défaut
    le cas du case ne marche pas et concernant mon pb de doublons
    je copie 2 lignes et les stock dans fichier nommé password
    dans les 2 lignes copiées, il y a des info redondantes
    ex ligne 1 : toto:100:reseau
    ex ligne 2 : 100:trt:reseau:/home/ etc ..

    donc dans le fichier password il y aura les 2 lignes copiées avec 100 et reseau en doublons

    comment les enlever , je ne trouve pas

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77 Voir le message
    le cas du case ne marche pas
    Petit oubli de ";;" (corrigé)

    Citation Envoyé par monsieur77 Voir le message
    et concernant mon pb de doublons
    je copie 2 lignes et les stock dans fichier nommé password
    dans les 2 lignes copiées, il y a des info redondantes
    ex ligne 1 : toto:100:reseau
    ex ligne 2 : 100:trt:reseau:/home/ etc ..

    donc dans le fichier password il y aura les 2 lignes copiées avec 100 et reseau en doublons
    Exact. Est-ce grave d'avoir ce doublon ? A toi de le dire. Si oui, alors faut pas que tu copies l'intégralité des lignes dans le fichier "password" mais que
    1) tu utilises la ligne récupérée par le grep pour en extraire les infos utiles =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ligne=`grep "..." fichier`
    info1=`echo "$ligne" |cut -f1 -d:`
    info2=`echo "$ligne" |cut -f2 -d:`
    etc...
    2) tu n'écris dans le fichier password que les infos que tu veux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$info1:$info2:etc..." >>passwd

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 106
    Points : 48
    Points
    48
    Par défaut
    je ne peux pas des le debut choisir les données qui m'interesse afin d'éviter les doublons ( avec grep cut etc ..) car les 2 fichiers ou je dois récolter les infos param_user et param_carac ont des lignes qui ne sont pas écrites de la meme facon du début jusqu'à la fin sauf pour param_user

    exemple pour param_user ce sera tout le tps la meme chose :
    login : id : service ==> toto:500:reseau
    tata:666:admin

    pour param_carac c'est dans le désordre par rapport au colonne
    500:A:reseau:
    458:B:dev:
    admin:A:
    etude:C:

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par monsieur77 Voir le message
    je ne peux pas des le debut choisir les données qui m'interesse afin d'éviter les doublons ( avec grep cut etc ..) car les 2 fichiers ou je dois récolter les infos param_user et param_carac ont des lignes qui ne sont pas écrites de la meme facon du début jusqu'à la fin sauf pour param_user

    exemple pour param_user ce sera tout le tps la meme chose :
    login : id : service ==> toto:500:reseau
    tata:666:admin

    pour param_carac c'est dans le désordre par rapport au colonne
    500:A:reseau:
    458:B:dev:
    admin:A:
    etude:C:
    Tu veux dire que le fichier "param_carac" n'est pas au même format à chaque ligne ? Certaines lignes contiennent 3 champs et d'autres 2 champs ???

    A partir de "toto", tu récupères "toto:500:reseau" puis tu en extraits "500" ok.
    A partir de "500" tu récupères "500:A:reseau:". Et que fais-tu ensuite ??? A quoi servent les 2 lignes "admin:A:" et "etude:C:" ???

  16. #16
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Petite parenthèse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo admin reseau dev etude |grep "$2" 1>/dev/null
    Il faut faire gaffe au grep quand même : il reconnaitra aussi les mots incomplets ("admi") ou l'espace. On peut par exemple faire appel à l'option -w (--word-regexp) de grep. Et plutôt que de rediriger la sortie, on peut utiliser l'option -q (--quiet).

    sauf qu'on préfère tester si le nb d'arguments est plus petit que 2 ce qui permet à l'utilisateur d'en entrer 36 s'il a envie tout en sachant bien que seul les 2 premiers seront pris en compte
    C'est discutable : si l'utilisateur entre plus de paramètres, c'est probablement le signe d'une erreur (soit, il a mal compris l'usage, soit il a oublié de protéger une expansion $foo au lieu de "$foo"). Je trouve ça plus sympa de lui dire (au moins un warning, mais je préfère l'erreur), plutôt que de renvoyer un résultat qui sera probablement erroné.

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LLB Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo admin reseau dev etude |grep "$2" 1>/dev/null
    Il faut faire gaffe au grep quand même : il reconnaitra aussi les mots incomplets ("admi") ou l'espace. On peut par exemple faire appel à l'option -w (--word-regexp) de grep.
    Ouaip. C'était plus pour lui donner un "ordre d'idée des différentes méthodes possibles" que la méthode exacte anti-tout (j'ai un peu tapé en live ces 4 exemples). Effectivement il y a danger dans cette méthode particulière du grep...

    Citation Envoyé par LLB Voir le message
    Et plutôt que de rediriger la sortie, on peut utiliser l'option -q (--quiet).
    Etant donné que je travaille en multi-environnements (sun, linux, unix) je préfère essayer de rester le plus "universel" possible plutôt que d'utiliser des options (trop) récentes et donc (moins) portables. Mais en effet c'est possible...

    Citation Envoyé par LLB Voir le message
    C'est discutable : si l'utilisateur entre plus de paramètres, c'est probablement le signe d'une erreur (soit, il a mal compris l'usage, soit il a oublié de protéger une expansion $foo au lieu de "$foo"). Je trouve ça plus sympa de lui dire (au moins un warning, mais je préfère l'erreur), plutôt que de renvoyer un résultat qui sera probablement erroné.
    Ouaip. Tout se discute. Ensuite c'est en fonction du but, du besoin et de plein d'autres choses

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

Discussions similaires

  1. Aide sur requete SQL + Conditions
    Par Elbozo dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 16/09/2010, 10h13
  2. [XL-2007] Aide sur une condition
    Par Nickname dans le forum Excel
    Réponses: 9
    Dernier message: 21/08/2009, 10h00
  3. besoin d'aide sur tri shell
    Par eaglevmt-4 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 30/12/2008, 17h35
  4. Demande d'aide sur macro a double conditions
    Par zinebs dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/11/2007, 23h23

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