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 :

Construire une commande dynamiquement


Sujet :

Shell et commandes GNU

  1. #1
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut Construire une commande dynamiquement
    Bonjour,

    Voilà mon problème.
    Je travaille sur un fichier et je dois exclure certaines lignes. Le problème est que je ne connait les critères d'exclusion qu'au moment de l'exécution.

    Je construit donc une chaîne de caractères comme ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GREP_COMMANDS="grep -v motif1  | grep -v motif2  | grep -v motif3"
    et je construis ma commande comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMD="cat /var/tmp/find.log |  $GREP_COMMANDS"
    Quand je cherche a exécuter cette commande par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $CMD > /var/tmp/find2.log
    j'obtiens des erreurs du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cat: |: No such file or directory
    cat: grep: No such file or directory
    cat: motif1: No such file or directory
    cat: |: No such file or directory
    .....
    Ou est ce que j'ai foiré mon code ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Tu dois afficher le résultat de ta variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CMD="cat /var/tmp/find.log |  `echo $GREP_COMMANDS`"

  3. #3
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    MERCI !!! je testes tout de suite

    Edit1: ben non ca marche pas
    Edit2 : aiie j'avais pas vu les quote inversées. Je reteste

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    cf. man bash -> Substitution de commande
    en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CMD=$(commande1 | commande2)
    CMD2=$(commande3 | $CMD)
    mais es-tu sûr de ne pas pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fichier="/var/tmp/find.log"
    CMD=$(grep -v motif1 $fichier | grep -v motif2 | grep -v motif3)
    echo $CMD
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    En fait quand j'ai mis motif1 motif2 motif3 c'était pour un exemple. Mais je peux en avoir un nombre indeterminé. C'est pour celà que je construit une chaîne de grep ... | grep ... | grep...

    Voilà le code que j'ai essayé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GREP_COMMANDS=" grep -v motif1 "
    CMD=$(cat /var/tmp/find.log |   $GREP_COMMANDS)
    $CMD
    et voilà l'erreur que celà me sort:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./t.sh: line 4: ./dir/dir1 is a directory
    Je précise que le fichier find.log contient des lignes de texte qui sont des noms de fichiers.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Et la ligne 4 est où?

    tu devrais nous donner l'ensemble de ton code afin d'essayer de comprendre ce que tu souhaites faire.

    l'erreur indique peut-être que tu essaies de faire un traitement qui est applicable pour un fichier et non pour un repertoire.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    nos messages ont dû se croiser...
    C'est pour celà que je construit une chaîne de grep ... | grep ... | grep...
    n'importe ! le premier grep prend pour argument le nom du fichier (sinon c'est un uuoc*)

    Si tu ne fais pas de `echo` devant la variable qui contient le résultat de la substitution de commande, les données sortent brutes : tu auras la même erreur si tu entres un mot quelconque ou un nom de fichier directement dans la console, éventuellement les fichiers éxécutables ... s'éxécuteront !

    la ligne 4 est, sans doute, dans `t.sh`
    ...
    ?

    --
    uuoc : Useless Use Of Cat
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    D'accord:

    1) le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    set -x
    GREP_COMMANDS=" grep -v motif1 "
    CMD=$(cat ./find.log |   $GREP_COMMANDS)
    $CMD
    2) la log d'exécution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    moi@moi-laptop:~/couic$ ./t.sh
    + GREP_COMMANDS=' grep -v motif1 '
    ++ cat ./find.log
    ++ grep -v motif1
    + CMD='./dir1/file1
    ./dir2/file1
    ./dir2/file2'
    + ./dir1/file1 ./dir2/file1 ./dir2/file2
    ./t.sh: line 5: ./dir1/file1: No such file or directory

    3) Le fichier ./find.log

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ./dir1/motif1.txt
    ./dir1/file1
    ./dir2/file1
    ./dir2/file2
    Edit1: si je mets la command "cat .... | grep .... | grep ...." dans un fichier .sh et que je l'appelles dans mon script ca me fais ce que je veux. Mais je trouve pas ca top

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    Qu'est-ce que tu ne comprends pas dans : "il faut afficher/éditer le contenu de la variable avec echo" (i.e. le résultat de la substitution de commande) ?

    ou printf, peu importe
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Qu'est-ce que tu ne comprends pas dans : "il faut afficher/éditer le contenu de la variable avec echo" (i.e. le résultat de la substitution de commande) ?

    ou printf, peu importe
    J'ai fais exactement ce que tu m'as dit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GREP_COMMANDS=" grep -v motif1 | grep -v toto"
    CMD="cat ./find.log |  `echo $GREP_COMMANDS`"
    echo $CMD
    $CMD
    Voici le résultat avec la commande echo:
    cat ./find.log | grep -v motif1 | grep -v toto
    ./dir1/motif1.txt
    ./dir1/file1
    ./dir2/file1
    ./dir2/file2
    cat: |: No such file or directory
    cat: grep: No such file or directory
    cat: motif1: No such file or directory
    cat: |: No such file or directory
    cat: grep: No such file or directory
    cat: toto: No such file or directory

    Correction: plutot que d'appeler la commande par $CMD, il suffit d'appeler la commande avec


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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    "Le monsieur a dit"* :
    1- cherche dans la manpage de bash 'Subsitution de commande'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    man bash
    /
    Substitution de commande
    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fichier="/var/tmp/find.log"
    CMD=$(grep -v motif1 $fichier | grep -v motif2 | grep -v motif3)
    echo $CMD
    --
    * référence aux Guignols de l'info
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    "Le monsieur a dit"* :
    Excuse moi, mais j'ai toujours rien compris à ce que tu me disais. Sans te vexer.
    Mais je te remercie beaucoup (c'est sincère) d'avoir cherché à me sortir d'affaire.

    Je continue avec "eval"

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    J'observe un gain de temps en faveur de la substitution de commande, plutôt que pour l'évaluation d'une expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monfichier2-4lignes="mon_fichier"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var=$(cat mon_fichier)
    time echo "$var"
    real    0m0.000s
    user    0m0.000s
    sys    0m0.000s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var="cat mon_fichier"
    time eval "$var"
    real    0m0.003s
    user    0m0.000s
    sys    0m0.004s
    
    ...
    ?

    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    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 : 62
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    D'après le roman-fleuve ci-dessus, je comprends que:

    • il existe un certain nombre de critères pour exclure certaines lignes d'un fichier d'entrée.
    • les données doivent être écrites dans un fichier de sorties.

    Mais je ne sais pas d'où viennent ces critères, alors j'ai écrit un script auquel on passe les critères comme paramètres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    params=$*
    motifs=${params// /|}
    grep -vE $motifs fichier_entree > fichier_sortie
    Pour exécuter le script, on tape donc: mon_script motif_1 motif_2 ... motif_n

  15. #15
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Merci beaucoup pour ce bout de code que je ne connaissais pas

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

Discussions similaires

  1. construire une requete dynamique
    Par solo190 dans le forum C#
    Réponses: 12
    Dernier message: 08/06/2011, 10h20
  2. Réponses: 4
    Dernier message: 30/12/2010, 19h15
  3. Construire une requête dynamiquement
    Par gabdeschenes dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 14/01/2010, 01h09
  4. Aide pour une commande dynamique
    Par guiblan dans le forum Langage
    Réponses: 1
    Dernier message: 28/08/2009, 05h28
  5. construire une requete dynamiquement
    Par highman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/04/2007, 12h49

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