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 :

[Bash] Exécution d'un script awk en texte


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Points : 47
    Points
    47
    Par défaut [Bash] Exécution d'un script awk en texte
    Bonjour,

    Je suis sur un problème en ce moment, j'essaie d’exécuter une commande AWK passer en argument d'une fonction. Un petit exemple s'impose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var="awk '.....' | "
     
    for Fichiers In Source
                 var cmd1(Fichiers)
    Ici le problème c'est que le awk se lance mais ne fait rien (j'ai un prompt avec marquer AWK)

    Si vous avez des idées je suis preneur.

    Cordialement

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur Systèmes et Réseaux
    Inscrit en
    Janvier 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur Systèmes et Réseaux

    Informations forums :
    Inscription : Janvier 2012
    Messages : 41
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Je pense que tu veux exécuter du bash et je suppose que tu veux mettre le résultat d'une commande dans une variable ?

    Si c'est le cas, il faut faire ainsi :
    Sinon précise un peu plus.

    Tu veux créer une fonction qui fait un awk sur les fichiers que tu passe en argument ?

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

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

    Citation Envoyé par la_fouine1806
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var="awk '.....' | "
     
    for Fichiers In Source
                 var cmd1(Fichiers)
    à part l'affectation de la variable, ici, rien ne fait quoi que ce soit !

    est-ce qu'on peut balancer "du code", ou ce qui y ressemble, et demander une solution ?

    Citation Envoyé par la_fouine1806
    Si vous avez des idées je suis preneur.
    entre autres: lire les tutos qui figurent dans ma signature !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Points : 47
    Points
    47
    Par défaut
    Ok je vais préciser parce que si j'utilise la façon d'appeler mon awk fait planté mon truc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    traitement_1[1]="dos2unix"
    traitement_2[1]=$(awk -f /home/data/script)
    traitement_3[1]=iconv -f iso-9001 -t  UTF-8 
     
    for Fichiers In Dossier
    traitement_1[1] ${Fichiers}|traitement_2[1]|traitement_3[1]|chargement du fichier en base.
    il ne veut pas exécuter le programme... (un peu comme une boucle infini)

    Si je mets
    traitement_2[1]=$("awk -f /home/data/script")
    La je vois qu'il fait le dos2unix par contre après rien du tout et tout est mis en table d'erreur.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    la mise en variables de commandes pour ensuite les exécuter en les appelant via autant de variables n'a aucun intérêt.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Points : 47
    Points
    47
    Par défaut
    Perso je vois un intérêt, car si je la tape à la main je peux pas appliquer mon traitement à la main apres je t'avoue que traitement 2 et 3 je pourrais les mutualisés... mais c'est un autre débat...

    ici mon problème est de laisser à la main mon script a un autre et qu'il puisse s'en servir sans tout recoder.
    Je m'explique.

    Mon script se découpe en 3. Un fichier de paramètrage ( qui ne demande pas connaissance en info), un fichier de fonction (qui demande des connaissances informatique) et un lanceur.

    je veux que la personne soit capable si elle le souhaite ajouter des prétraitements comme des iconv, des scripts awk, sed ou autre... sans pour autant modifier mon fichier de fonction.

    Voila pourquoi je passe des commandes en variables...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    ça n'a pas d'intérêt car ça peut amener des complications.

    éventuellement, utilise des alias (mais ils ne prennent pas d'arguments), ou des fonctions.

    d'après ce que j'ai pu observer, les développeurs utilisent des variables pour mémoriser des commandes avec leurs chemins, c'est tout.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    c'est noël. J'ai donc envie de dissiper toutes les tensions dues à cette discussion plutôt que de jouer au chat et à la souris.

    Le premier message de la_fouine1806 est inepte: la lecture de n'importe quel tutoriel montre que ce n'est pas comme ça que l'on récupère le résultat d'une commande. Cela montre une absence de travail. Et personne n'aime cela ici.

    Le deuxième message de la_fouine1806 est inepte: awk est un outil de transformation de fichier texte en un autre fichier texte. Il y a donc un traitement et une cible. Demander l'exécution d'un script (-f /home/data/script ) sans indiquer la cible "fait planter". En fait, il attend la fameuse cible. C'est crétin.
    [aparté]On dirait le sketch des inconnus avec Laurel et Hardy puis Dutronc et Françoise Hardy [/aparté]


    NB:
    (mais ils ne prennent pas d'arguments)
    Cela dépend comment on voit. Ce ne sont pas des paramètres, mais on peut mettre un début de commande en facteur commun.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,

    Comme N_BaH, je ne vois pas trop l'utilité, mais c'est faisable (mais à première vu, tu devrais lire les tutos de sa signature, car ta syntaxe ne ressemble pas à du pseudo code ou du shell, mais plutôt à un mélange des 2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ BOB="ls -l"
    $ BIB="head -1"
    $ ls -l flow.*
    -rw-r--r-- 1 disedorgue disedorgue   863 21 déc.  22:14 flow.asy
    -rw-r--r-- 1 disedorgue disedorgue 28609 21 déc.  22:28 flow.svg
    $ $BOB flow* | $BIB
    -rw-r--r-- 1 disedorgue disedorgue   863 21 déc.  22:14 flow.asy
    Cordialement.

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par la_fouine1806 Voir le message
    Bonjour,

    Je suis sur un problème en ce moment, j'essaie d’exécuter une commande AWK passéer en argument d'une fonction. Un petit exemple s'impose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var="awk '.....' | "
     
    for Fichiers In Source
                 var cmd1(Fichiers)
    Ici le problème c'est que le awk se lance mais ne fait rien (j'ai un prompt avec marquer AWK)

    Si vous avez des idées je suis preneur.

    Cordialement
    Je pense avoir compris ce que tu veux faire...

    Il y a 2 possibilités:
    soit l'utilisateur tape les pipes
    soit ils sont intégrés dans les variables

    Dans tous les cas, contrairement à ce qui avait été dit dans les premières réponses (probablement parce que les spécifications n'étaient pas encore très claires), il ne faut surtout pas utiliser var=$(...) car l'évaluation a lieu trop tôt (à l'affectation de la variable, alors qu'on la souhaite lors de son utilisation).

    Si l'utilisateur tape les pipes, tu peux faire quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var="awk '.....'"
     
    for Fichier In ${Source}
    do cat ${Fichier} | ${var}
    done
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    traitement_1[1]="dos2unix"
    traitement_2[1]="awk -f /home/data/script"
    traitement_3[1]="iconv -f iso-9001 -t  UTF-8"
     
    for Fichiers In Dossier/*
    do ${traitement_1[1]} ${Fichiers} | ${traitement_2[1]} | ${traitement_3[1]} | chargement du fichier en base.
    done
    Si tu souhaites que l'utilisateur n'ait pas à taper les pipes, c'est plus compliqué parce qu'il faut utiliser the evil eval en gérant subtilement les guillemets et apostrophes, avec quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var1="awk '.....' |"
     
    for Fichier In ${Source}
    do eval "cat ${Fichier} ${var1} ${var2}"
    done
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    traitement_1[1]="dos2unix"
    traitement_2[1]=" | awk -f /home/data/script"
    traitement_3[1]=" | iconv -f iso-9001 -t  UTF-8"
     
    for Fichiers In Dossier/*
    do eval "${traitement_1[1]} ${Fichiers} ${traitement_2[1]} ${traitement_3[1]} | chargement du fichier en base."
    done

Discussions similaires

  1. Correction Script bash : Exécution et recevoir le test par log ainsi email
    Par hackmed dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 14/05/2015, 04h07
  2. Réponses: 0
    Dernier message: 18/10/2013, 13h32
  3. Initialiser une variable bash dans un script awk
    Par TomRay dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 08/01/2011, 18h25
  4. Réponses: 8
    Dernier message: 27/07/2006, 09h40

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