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 POSIX Discussion :

[pdksh] echo $var | awk


Sujet :

Shell et commandes POSIX

  1. #1
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut [pdksh] echo $var | awk
    Bonjour,

    Sous OpenBSD, pdksh - par defaut - :

    À la ligne de code shell suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "${line}" | cut -d':' -f2- | trim
    que je remplace aisément par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%s' "${line}" | awk -F ':' '{ gsub(/[[:space:]]*/, "", $2) ; printf "%s",$2 }'
    Néanmoins, je me dis - peut-être à tord - que je devrais pouvoir tout faire juste avec awk ; il me semble avoir un début de réponse mais je ne suis pas sûr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ':' -v l="${line}" '{ gsub(/[[:space:]]*/, "", $2) ; printf "%s",$2 }'
    Le shell reste en attente...

    Une suggestion utile ?!
    Merci d'avance.

  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 458
    Points
    13 458
    Par défaut
    Bonjour

    Le shell reste en attente...
    Évidemment. Il n'y a pas de fichier en entrée. Donc il lit sur l'entrée standard et attend une entrée.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Évidemment...

    Donc, je peux oublier - puisqu'il faut lui injecter d'une manière ou d'une autre l'affichage de la valeur de la variable $line.

    Merci du rappel !

  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 458
    Points
    13 458
    Par défaut
    Non non non. Je n'ai pas dit cela. Je dis que tu as mis l'information à traiter dans le script. Et pas à l'entrée du script. Ça va marcher. Mets le puzzle en ordre.

    Soit tu colmates l'entrée. Soit tu mets ton info en entrée.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Euh, je crois que je te comprend pas..
    ou du moins, si je comprends bien ce que tu me dis, tu me dis d'injecter la variable en entrée... or, le seul moyen que je connaisse est par l'injection d'un affichage - cat, echo, printf - ou en bash grâce au redirecteur '<<<'...
    autrement, oui, je ne comprends pas :p

    donc, hormis le fait de passer par une entrée précédent la commande 'awk', je ne saisis pas comment faire ?!


    D'ailleurs, je me rends compte que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%s' $line | awk -F ':' '{ printf $2 }'
    suffit largement

  6. #6
    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
    Non, les lignes avec awk que tu sembles valider ne font pas la même chose que ton cut initial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo 'bob1:bob2:bob3' | cut -d':' -f2-
    bob2:bob3
    $ echo 'bob1:bob2:bob3' | awk -F: '{ printf $2 }'
    bob2
    par contre, en ksh, il me semble que ceci fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ line='bob1:bob2:bob3'
    $ echo "${line#*:}"
    bob2:bob3
    Cordialement.

  7. #7
    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
    Cette commande awk -F ':' -v l="${line}" '{ gsub(/[[:space:]]*/, "", $2) ; printf "%s",$2 }' attend une entrée et tu n'en a pas. Dis lui d'aller voir Dave Null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ':' -v l="${line}" '{ gsub(/[[:space:]]*/, "", $2) ; printf "%s",$2 }' /dev/null
    Et là, ton script est exécuté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ toto=koko
    $ awk "BEGIN{ print \"$toto\";}"
    koko
    Le script ci-dessus n'a pas d'entrée et pourtant n'en attend pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk "BEGIN{ print 3*2;}" /dev/null
    6
    $ awk "{ print 3*2;}" /dev/null
    $
    Ce dernier script attend une entrée, et en trouve une.
    Aucune sortie car le fichier est vide.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Je te remercie pour le "dave null"... j'avoue, je n'y aurais pas pensé ! Merci beaucoup

    De même, pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%s\n' "${line#*:}"
    qui suffit largement, et fonctionne bien avec pdksh.
    (pourquoi faire simple quand on peut faire compliquer... là, encore, merci du rappel)

    Par contre, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ awk -F ':' "BEGIN { print \"$line\"; } { gsub(/[[:space:]]*/, \"\", $2) ; printf '%s',$2 }" /dev/null     
    awk: syntax error at source line 1
     context is
    	BEGIN { print "un texte:un mot:une phrase"; } { gsub(/[[:space:]]*/, "", >>>  ) <<< 
    awk: illegal statement at source line 1
    awk: illegal statement at source line 1
    Je ne comprend pas en quoi la parenthèse fermante le trouble ?!

  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
    Le $2 est interprété par le shell et non par le awk
    Cordialement.

  10. #10
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Bonjour, et merci à tous les deux.

    Finalement, je viens de m'y remettre depuis quelques minutes, et à-priori avec un résultat satisfaisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -F ':' "BEGIN { print \"${line#*:}\"; } { gsub(/[[:space:]]*/, \"\", $0) ; printf \"%s\",$0 }" /dev/null
    bob2:bob3
    n'est-ce pas ?!

    PS : Je ne sais pas pourquoi, mais aujourd'hui, j'y suis arrivé !




    Par contre, je suis surpris, si j'injecte une espace devant la var line, elle n'est pas supprimée - qu'est-ce que j'ai loupé ?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk -F ':' "BEGIN { print  \" ${line#*:}\"; } { gsub(/[[:space:]]*/, \"\", $0) ; printf \"%s\",$0 }" /dev/null         
     bob2:bob3
     
    $ awk -F ':' "BEGIN { print  \" ${line#*:}\"; } { printf \"%s\",$0 }" /dev/null                                  
     bob2:bob3
    ???

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,

    Citation Envoyé par hucste Voir le message

    Par contre, je suis surpris, si j'injecte une espace devant la var line, elle n'est pas supprimée - qu'est-ce que j'ai loupé ?!
    Le BEGIN est exécuté au début.
    Le corps du script est exécuté pour chaque ligne.
    Le problème ici, c'est que tu n'as pas de ligne et le corps n'est jamais exécuté.
    Soit, tu fais tout dans BEGIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ':' "BEGIN { ligne=  \" ${line#*:}\"; gsub(/[[:space:]]*/, \"\", ligne) ; printf \"%s\n\",ligne }" /dev/null
    Soit, tu utilise le END :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ':' "BEGIN { ligne=  \" ${line#*:}\"}END{gsub(/[[:space:]]*/, \"\", ligne) ; printf \"%s\n\",ligne }" /dev/null
    Cordialement.

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

Discussions similaires

  1. Echo "<?=$var?>" dans HTML
    Par lynnaryas dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2012, 18h40
  2. Ecrire $var dans un fichier avec cmd echo ?
    Par jojodeparis dans le forum Langage
    Réponses: 4
    Dernier message: 18/10/2010, 11h36
  3. awk : protection d'une var issue d'un script sh
    Par Fung999 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 02/03/2008, 19h02
  4. Envoyer un message icmp (Echo Request)
    Par ovdz dans le forum Développement
    Réponses: 5
    Dernier message: 19/06/2003, 14h14
  5. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26

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