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

Windows Discussion :

POWERSHELL : équivalent de la commande AWK


Sujet :

Windows

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 461
    Points : 283
    Points
    283
    Par défaut POWERSHELL : équivalent de la commande AWK
    Bonsoir,
    Je suis en train de transcrire un Shell UNIX en POWERSHELL (que je viens juste de découvrir). Je cherche à faire l'équivalent d'un AWK pour récupérer une chaîne dans une variable.

    Voici la commande UNIX que je dois reproduire :
    ma_variable=`grep chaine mon_fichier | awk '{print $3}'`
    -> (obtention du 3ème champs de la ligne contenant "chaine"

    Voici la commande Powershell que j'ai commencé mais que je n'arrive pas à terminer :
    $global:ma_variable = Select-String chaine mon_fichier | équivalent_du_awk



    Merci d'avance pour votre aide.

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cd c:\temp
    $S="Le mot recherché est le troisième"
    $S>Tst.txt
    $var=Select-String "^le mot" Tst.txt|Foreach-Object {((($_).Line).Split())[3-1]}
    $var
    Select-String renvoi, dans le pipe, une instance de la classe Microsoft.PowerShell.Commands.MatchInfo qui posséde une propriété Line de classe String qui elle contient la méthode Split.
    Ensuite on récupére le troisième élément du tableau renvoyé par la méthode Split.
    Il y a sûrement plus simple mais cela dépend de ton contexte. A noter que Switch peut charger un fichier et opérer sur chaque ligne à l'aide de regexp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    switch -regex -file tst.txt
    { 
     "^le mot" { $Idx=2; (($_).Split())[$Idx] ; continue}
     #Autres clauses Switch
     ...
    }
    Il faut juste faire attention à la taille du fichier, s'il est > à 20 Ko autant utiliser une construction autour d'un pipe ce qui limitera l'utilisation mémoire et la surcharge du Garbage collector de .NET.
    Enfin là on plus dans une approche d'optimisation et c'est peut être prématuré ici

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 461
    Points : 283
    Points
    283
    Par défaut
    Bonsoir Laurent et merci pour ta réponse.

    Peux tu m'indiquer la signification de 1-3 dans Split()[3-1].

    Par ailleurs, est-il posible de faire le même type de boucle qu'avec le shell (Unix) ci-dessous qui boucle sur un fichier fichier.tmp, renseigne des variables puis lance la fonction EXECUTER_TRAITEMENT définie plus haut.

    while read procedure
    do
    export type_trait=`echo $procedure | awk '{print $1}'`
    export traitement=`echo $procedure | awk '{print $2}'`
    export param_trait=`echo $procedure | awk '{print $3}'`
    export param2=`echo $procedure | awk '{print $4}'`
    export param3=`echo $procedure | awk '{print $5}'`
    export param4=`echo $procedure | awk '{print $6}'`
    EXECUTER_TRAITEMENT
    done


    Merci d'avance

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tibal
    Peux tu m'indiquer la signification de 1-3 dans Split()[3-1].
    Sous .NET les tableaux débute à zéro c'était pour te l'indiquer, à prioris c'est raté

    Pour info:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    {
        (                               
           (
             ($_)                     # caste l'objet reçu dans le pipeline
                   .Line               # récupère le contenu de la propriété Line
                         )              # cast l'objet en String
                           .Split()    #  appel de méthode renvoyant un tableau
                                     )  # Délimite l'expression précédente, un tableau
                                          [2]    #Manipulation du tableau, 3 iéme éléments
     } #Scriptblock du cmdlet foreach
    Citation Envoyé par tibal
    Par ailleurs, est-il posible de faire le même type de boucle qu'avec le shell (Unix)
    Dis moi ce que tu as en entrée et en sortie, cela fait un bail que je n'ai pas utilisé AWK.
    Dans le While il s'agit de la même ligne ou elle différe à chaque itération ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 461
    Points : 283
    Points
    283
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while read procedure
    do
      export type_trait=`echo $procedure | awk '{print $1}'`
      export traitement=`echo $procedure | awk '{print $2}'`
      export param_trait=`echo $procedure | awk '{print $3}'`
      export param2=`echo $procedure | awk '{print $4}'`
      export param3=`echo $procedure | awk '{print $5}'`
      export param4=`echo $procedure | awk '{print $6}'`
      EXECUTER_TRAITEMENT
    done < fichier.tmp
    Dis moi ce que tu as en entrée et en sortie, cela fait un bail que je n'ai pas utilisé AWK.
    Dans le While il s'agit de la même ligne ou elle différe à chaque itération ?
    En entrée (dans le fichier fichier.tmp), j'ai plusieurs lignes avec différents champs correspondants aux variables type_trait, traitement ,param_trait, param2, param3 et param4
    Le WHILE lit une ligne, remplit les variables puis lance la fonction EXECUTER_TRAITEMENT puis il recommence la même chose pour toutes les lignes. Seules les deux premières variables sont obligatoirement remplies.

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tibal
    Le WHILE lit une ligne, remplit les variables puis lance la fonction EXECUTER_TRAITEMENT puis il recommence la même chose pour toutes les lignes.
    Dans ce cas La solution est autour du Split de la ligne reçue en entrée.
    En revanche la construction seras différente...

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Pour info le cmdlet Select-String renvoi toutes les occurences trouvées dans un fichier. A mon avis ce n'est donc pas le plus adapté à ton pb car le contenu et la structure du fichier en entrée sont connu.

    Voir Get-Content :
    L'applet de commande Get-Content obtient le contenu de l'élément à l'emplacement spécifié par le chemin d'accès, par exemple le texte d'un fichier. Elle lit une ligne de contenu à la fois et retourne un objet pour chaque ligne.

+ 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. [PowerShell] POWERSHELL : équivalent de la commande WC
    Par tibal dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 15/03/2008, 22h17
  3. Commande awk
    Par ujoodha dans le forum Linux
    Réponses: 1
    Dernier message: 01/12/2005, 14h34
  4. Réponses: 11
    Dernier message: 12/04/2005, 14h08
  5. équivalant de la commande MINUS en MySQL
    Par El Saigneur dans le forum Requêtes
    Réponses: 7
    Dernier message: 01/09/2004, 17h03

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