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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    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
    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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    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.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    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.

+ 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, 09h20
  2. Réponses: 4
    Dernier message: 30/12/2010, 18h15
  3. Construire une requête dynamiquement
    Par gabdeschenes dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 14/01/2010, 00h09
  4. Aide pour une commande dynamique
    Par guiblan dans le forum Langage
    Réponses: 1
    Dernier message: 28/08/2009, 04h28
  5. construire une requete dynamiquement
    Par highman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/04/2007, 11h49

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