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 d'une variable d'environnement


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut [awk] Utilisation d'une variable d'environnement
    Bonjour à tous,
    Un petit problème avec la commande AWK.
    J'essaie de trier des fichiers dans un répertoire afin d'obtenir le propriétaire dudit fichier.

    pour chercher le propriétaire du fichier mon_fichier, je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -lH /mon/rep | awk '{ if ( $NF == mon_fichier ) print $3 }'
    et ça fonctionne.

    Malheureusement si j'utilise une variable d'environnement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var_fichier="nom_fichier"
    ls -lH /mon/rep | awk '{ if ( $NF == $var_fichier ) print $3 }'
    ça ne fonctionne pas. J'ai essayé en mettant des guillemets un peu partout, mais rien n'y fait, je dois surement passer à coté d'une option/syntaxe mais laquelle?

  2. #2
    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
    Effectivement, c'est une histoire de guillemets!

    Il ne faut pas les mettre un peu partout, mais juste au bon endroit (ou alors, il faut engager une sérieuse armée de singes...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var_fichier="nom_fichier"
    ls -lH /mon/rep | awk "{ if ( \$NF == $var_fichier ) print \$3 }"
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var_fichier="nom_fichier"
    ls -lH /mon/rep | awk '{ if ( $NF == '$var_fichier' ) print $3 }'
    PS: regarde bien les couleurs lors de l'affichage de ce message-ci sur ce forum: on dirait qu'il a bien compris ce que je/tu voulais faire!

  3. #3
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut
    Aucune des deux ne fonctionne

    ma version de awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk --version
    GNU Awk 3.1.5
    Copyright (C) 1989, 1991-2005 Free Software Foundation.

    exemple concret:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [tiresias@youyou:~/Desktop]$ touch bonjour
    [tiresias@youyou:~/Desktop]$ ls -lH ~/Desktop | awk '{ if ( $NF == "bonjour" ) print $3 }'
    tiresias
    [tiresias@youyou:~/Desktop]$ nom_fichier="bonjour"
    [tiresias@youyou:~/Desktop]$ ls -lH ~/Desktop | awk "{ if ( \$NF == $nom_fichier ) print \$3 }"
    [tiresias@youyou:~/Desktop]$ ls -lH ~/Desktop | awk '{ if ( $NF == '$nom_fichier' ) print $3 }'
    [tiresias@youyou:~/Desktop]$

  4. #4
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut
    Bon bin ça ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -lH ~/Desktop | awk '{ if ( $NF == ENVIRON["nom_fichier"] ) print $3 }'
    par contre il faut faire un export de nom_fichier avant.

  5. #5
    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

    • Pour introduire une variable dans awk on utilise généralement l'option -v.
      man awk pour plus de précisions
    • Les "double quotes" protègent tout sauf .... les expressions commes $var par exemple
      Les 'simples quotes' protègent tout. Point.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    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 tiresias54 Voir le message
    Aucune des deux ne fonctionne

    exemple concret:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [tiresias@youyou:~/Desktop]$ touch bonjour
    [tiresias@youyou:~/Desktop]$ ls -lH ~/Desktop | awk '{ if ( $NF == "bonjour" ) print $3 }'
    tiresias
    D'après ton exemple, il faut des guillemets autour du nom du fichier. D'où les corrections (au temps pour moi (j'eusse dû tester avant que de poster)):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -lH ~/Desktop | awk "{ if ( \$NF == \"$nom_fichier\" ) print \$3 }"
    ou bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -lH ~/Desktop | awk '{ if ( $NF == "'$nom_fichier'" ) print $3 }'

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

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


    Citation Envoyé par N_BaH
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!

    pour chercher le propriétaire du fichier mon_fichier, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stat -c %U /mon/rep/monFichier
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    • Les "double quotes" protègent tout sauf .... les expressions commes $var par exemple
    Bonjour
    Pas tout à fait. Les "double quottes" protègent tout sauf
    • le dollar ($) permettant d'avoir le contenu d'une variable => echo "$HOME".
    • les backquottes permettant d'avoir le texte affiché par une commande => echo "On est le `date`".
    • le caractère backslash à condition que sa présence soit justifiée (par exemple pour protéger un caractère spécial) et là c'est plus subtil
      Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      echo "\a"
      echo "La variable \$HOME contient $HOME"
      Dans le premier cas, le backslash n'étant pas justifié ("a" n'ayant rien de particulier), il sera alors affiché. Dans le second cas, le caractère "$" étant spécial, le backslash est manifestement là pour le protéger donc il ne sera pas affiché. En revanche il protègera le $ qui ne sera pas traité et sera donc, lui, affiché.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Awk utilisation d'une variable
    Par itsme2501 dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 09/09/2014, 23h21
  2. Créer un cron qui utilise une variable d'environnement
    Par PoichOU dans le forum Administration système
    Réponses: 2
    Dernier message: 03/05/2012, 19h21
  3. Utiliser une variable d'environnement
    Par Dagnir dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/10/2008, 18h17
  4. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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