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 :

[awk] Utilisation de variables externes


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Points : 133
    Points
    133
    Par défaut [awk] Utilisation de variables externes
    bonjour,
    je voulais savoir s'il y avait un moyen pour récupérer la valeur d'une variable externe à l'intérieur d'un script awk? (je ne peux pas utiliser l'option -v car elle n'est pas disponible sous unix)
    exemple: j'ai une variable i qui contient un résultat et je veux l'utiliser à l'intérieur d'un programme awk, comment je fais?
    merci d'avance

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 322
    Points : 211
    Points
    211
    Par défaut
    ça ne marche de la récupérer via "$i" ?

  3. #3
    Membre habitué Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par oligig
    ça ne marche de la récupérer via "$i" ?
    non malheureusement quand je mets $i c'est comme si j'ai mis $0 et donc il m'affiche le contenu de la ligne et c'est normal vu que i ne contient aucune valeur pour lui car c'est une variable externe

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 322
    Points : 211
    Points
    211
    Par défaut
    normalement ça marche en dehors des guillemets

  5. #5
    Membre habitué Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par oligig
    normalement ça marche en dehors des guillemets
    ça m'étonnerai car quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print $i}' tmp.log > result.log
    il me met dans le fichier "result.log" le même contenu que celui de "tmp.log"
    ce qui prouve bien qu'il interprete le $i comme $0

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 322
    Points : 211
    Points
    211
    Par défaut
    oui, mais c'est à l'intérieur des guillemets
    Je pensais à ce genre de code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FIC=/etc/passwd
    awk -F ":" '{ print $1 }' $FIC

  7. #7
    Membre habitué Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Points : 133
    Points
    133
    Par défaut
    tu as un moyen de l'utiliser à l'éxtérieur des guillemets? :
    genre:
    awk '{print "bla bla bla"}' tmp.log $i >> result.log
    mais ça c'est incorrect

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 322
    Points : 211
    Points
    211
    Par défaut
    Peut être ça, mais je sais pas du tout si ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print '$i'}' tmp.log > result.log

  9. #9
    Membre habitué Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par oligig
    Peut être ça, mais je sais pas du tout si ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print '$i'}' tmp.log > result.log
    dans ce cas ça n'affiche rien

  10. #10
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Alors il reste la solution du tableau ENV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print ENV["i"]}' tmp.log > result.log

  11. #11
    Membre habitué Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par 2Eurocents
    Alors il reste la solution du tableau ENV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print ENV["i"]}' tmp.log > result.log
    ça ne renvoie rien

  12. #12
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par soulhouf
    Citation Envoyé par 2Eurocents
    Alors il reste la solution du tableau ENV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print ENV["i"]}' tmp.log > result.log
    ça ne renvoie rien
    Ce n'est pas ENV, c'est ENVIRON. C'est une extension GNU, mais j'espère qu'elle peut tout de même fonctionner dans un script awk.

    Il faut, cependant, que la variable d'environnement soit bien exportée au préalable. Soit, en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    export i="TOTO"
    awk 'NR > 1{print ENVIRON["i"]}' tmp.log > result.log

  13. #13
    Membre habitué Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Points : 133
    Points
    133
    Par défaut
    ça marche pas non plus
    n'y a-t-il pas de moyen de dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{"bla bla bla"}' tmp.log "et" echo $i > result.log

  14. #14
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Par ailleurs :
    Citation Envoyé par soulhouf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print '$i'}' tmp.log > result.log
    dans ce cas ça n'affiche rien [/quote]

    Ca n'affiche rien chez moi non plus, mais ceci me donne aussi un bon résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print "'$i'"}' tmp.log > result.log
    Toujours sous réserve que i ait été exportée au préalable.
    Il faut donc, juste apres le print, ouvrir des guillemets pour introduire une chaine : "
    Puis il faut "sortir" du script awk en fermant la quote : '
    Puis il faut placer notre variable d'environnement que le shell substitue : $i
    Puis il faut "retourner" dans le script awk en rouvrant la quote : '
    Enfin, il faut fermer les guillemets pour terminer la chaine : "
    Et poursuivre le script awk ...

  15. #15
    Membre habitué Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par 2Eurocents
    Par ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print "'$i'"}' tmp.log > result.log
    Toujours sous réserve que i ait été exportée au préalable.
    Il faut donc, juste apres le print, ouvrir des guillemets pour introduire une chaine : "
    tu m'as sauvé merci beaucoup
    au passage il est joli le nouveau look du forum

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 322
    Points : 211
    Points
    211
    Par défaut
    Bravo ! Fallait y penser !

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Sujet assez ancien, mais awk en version 3.1.5 permet d'assigner une variable à partir d'une variable système
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    export i="TOTO"
    awk -v MYVAR=$i 'NR > 1{print MYVAR}' tmp.log > result.log
    Have fun

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

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

    ça marche aussi comme ça :
    si l'argument passé à awk n'est pas un fichier, et est une équation, alors c'est une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var="peu importe"
    awk 'NR > 1{print maVar}' maVar="$var" fichier

  19. #19
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par soulhouf Voir le message
    ça m'étonnerai car quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR > 1{print $i}' tmp.log > result.log
    il me met dans le fichier "result.log" le même contenu que celui de "tmp.log"
    ce qui prouve bien qu'il interprete le $i comme $0
    Bizarre! Chez moi, il n'est pas content:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo coucou | awk '{print $i}'
    awk: illegal field $(), name "i"
     input record number 1, file 
     source line number 1
    Pour passer le contenu de la variable i à awk, il suffit, tout simplement, de le lui passer dans la chaîne construite avec le constructeur 'guillemets' du shell (qui est différent du constructeur quote):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk "NR > 1{print \"$i\"}" tmp.log > result.log
    (qui est équivalent à la solution proposée par 2Eurocents)

    Si $i contient des caractères trop particuliers (comme le guillemet), ça marche pas...
    Il vaut mieux alors utiliser les solutions proposées par N_BaH...

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

Discussions similaires

  1. Utiliser une variable "externe" dans une condition xsl
    Par JulienNvr dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 06/01/2014, 16h45
  2. [awk] Utilisation d'une variable d'environnement
    Par tiresias54 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 06/08/2013, 09h26
  3. [MediaWiki] Utiliser des variables externes dans une page wiki
    Par mayok dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 16/08/2011, 06h20
  4. Utilisation de variables "extern" fastidieuses!
    Par LeNoob dans le forum Débuter
    Réponses: 14
    Dernier message: 10/07/2008, 10h48
  5. Réponses: 7
    Dernier message: 24/01/2007, 11h01

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