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 :

syntaxe commande awk


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut syntaxe commande awk
    Bonjour,

    En relisant un script écrit par un collègue maintenant partie, je me suis arrêté sur instruction awk que je ne comprends pas "$1~/'$ENV'/ "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v ENV=PRD -v IDENT=TOTO '/^#/ || /^$/ {next}  $1~/'$ENV'/ { print $1 }' toto.txt
    Pourriez-vous m'expliquer cette commande?


    D'avance merci,

  2. #2
    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 459
    Points
    13 459
    Par défaut
    Bonjour,

    awk: outil de transformation de fichiers textes, utile si on utilise de l'arithmétique ou si le fichier est organisé en champs (alors désignés par $1 $2 $3 ...). Sinon on peut utiliser sed.

    -v : option qui permet de faire rentrer une variable à l'intérieur du script. Plus souvent, cela permet de faire rentrer une variable extérieure à l'intérieure. Si c'était une constante, on la mettrait dans une clause BEGIN de awk. Enfin, chacun est libre.

    toto.txt la cible à laquelle s'applique le script.

    Le script est généralement contenu dans une chaîne de caractère entre quotes car ces signes protègent de tout, contrairement aux double-quotes qui ne protègent pas les variables (alors interprétées).

    A l'intérieur du script, on répond à la question "quand?" avant les accolades (par défaut, à chaque ligne ou enregistrement) et la question "quoi?" entre accolades (par défaut, imprimer en sortie la ligne entière)

    La réponse à la question "Quand?" peut être BEGIN (avant le traitement du fichier) ou END (Après le traitement du fichier) ou une condition (ex: NR==1 pour cibler le premier enregistrement, /regex/ pour les lignes contenant l'expression régulière regex), etc...
    Ici, on lit donc que pour les lignes qui commencent par un croisillon ou pour les lignes complètement vides, on passe à la ligne suivante sans ne rien faire ({next;})

    La suite est plus bizarre.
    La condition demande que le premier champ de la ligne (sûrement jusqu'à la première espace) contiennent l'expression régulière suivante. Dans ce cas là, on écrit en sortie le premier champ.
    Les quotes sont utilisés pour sortir (et rentrer) de ce cocon qui protège de tout afin que la variable $ENV soit interprétée et remplacée par son contenu.

    Pourquoi est-ce bizarre? Pour 3 raisons.
    • Pourquoi mélanger la technique qui consiste à déclarer les variables avant le script et la technique qui consiste à balancer la variable en plein milieu de script ?
    • Pourquoi définir une variable interne ENV (qui vaut PRD manifestement) inutilisée et faire appel à une variable externe $ENV ?
    • Pourquoi ne pas protéger $ENV par "$ENV" pour éviter les quiproquos en cas de présence d'espaces dans le contenu de $ENV ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Merci pour votre réponse.
    Si j'ai bien compris votre réponse l'expression $1~/'$ENV'/ permet de sélectionner uniquement les lignes ou le premier champs correspond à la variable ENV, est ce bien cela?

    Pour que vous puissiez mieux comprendre la logique de mon collègue, je vous met la version longue de son script. J'avais ôté tout ce qui n’était pas utile (enfin, il me semble) à ma question.
    Encore une fois merci pour votre aide....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    ENV=$1						
    IDENT=${2:-ALL}					
    if [ "$ENV" == "" ]; then
    	echo "Manque nom environnement en argument de get_ACCES.sh" >&2
    	exit 111
    fi
     
    awk -v ENV=$ENV -v IDENT=$IDENT '\
    /^#/ || /^$/ {next}
    $1~/'$ENV'/ {					
    	if ($2 == IDENT || IDENT == "ALL") {	
    		serveur = $5			
    		repert  = ""			
     
     
    		posit = index ($5, "/")				
    		if (posit > 0) {				
    			serveur  = substr ($5, 0, posit-1)	
    			repert   = substr ($5, posit)		
    		}
    		else {
    			posit = index ($5, "~")			
    			if (posit > 0) {			
    				serveur  = substr ($5, 0, posit-1)
    				repert   = substr ($5, posit+1)	
    			}
    		}
    		printf ("EXP_USR_%s=\"%s\";EXP_PWD_%s=\"%s\";EXP_SRV_%s=\"%s\";EXP_TXT_%s=\"%s\";",
    			         $2,  $3,          $2,  $4,          $2,  serveur,     $2,  $6)
     
    		if (repert != "") {
    			printf ("EXP_DIR_%s=\"%s\";", $2, repert)
    		}
    		if ($2 == IDENT) {
    		    printf ("EXP_USR_CURRENT=\"%s\";EXP_PWD_CURRENT=\"%s\";EXP_SRV_CURRENT=\"%s\";EXP_TXT_CURRENT=\"%s\";",
    					       $3,		      $4,		     serveur,		    $6)
    		    if (repert != "") {
    			printf ("EXP_DIR_CURRENT=\"%s\";", repert)
    		    }
    		    exit
    		}
    	}
    }' /toto.txt

  4. #4
    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 459
    Points
    13 459
    Par défaut
    Si j'ai bien compris votre réponse l'expression $1~/'$ENV'/ permet de sélectionner uniquement les lignes ou le premier champs correspond à la variable ENV, est ce bien cela?
    Oui. Ou plutôt "contient" au lieu de "correspond".

    Admettons que ce soit un script bash (il n'y a pas de shebang ) que j'appelle mon_script.bash
    La première ligne ENV=$1 signifie que la variable ENV prend la valeur du premier paramètre du script.
    Si on tape mon_script.bash /tmp suite de param alors $1 est égal à /tmp et par suite ENV contiendra /tmp.

    On retrouve la bizarrerie déjà identifiée: on définit ENV interne et on utilise $ENV externe.
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ENV |awk -v ENV=PRINT '($1 ~ ENV){ print;}'
    PRINTER=Canon LBP5050
    Donc ici, au lieu de $1~/'$ENV'/ {, il serait cohérent de faire:
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Merci pour votre aide et vos explications.

    Bonne journée

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

Discussions similaires

  1. Option NR de la commande AWK
    Par tux2005 dans le forum Linux
    Réponses: 5
    Dernier message: 20/09/2010, 14h25
  2. Commande awk fonction gsub
    Par vbcasimir dans le forum Linux
    Réponses: 1
    Dernier message: 29/05/2006, 11h12
  3. Questions sur la commande awk
    Par vbcasimir dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 17/01/2006, 10h35
  4. Commande awk
    Par ujoodha dans le forum Linux
    Réponses: 1
    Dernier message: 01/12/2005, 14h34
  5. Réponses: 11
    Dernier message: 12/04/2005, 14h08

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