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 :

Extraction et mise en argument


Sujet :

Shell et commandes GNU

  1. #1
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    Par défaut Extraction et mise en argument
    J'aimerais via une commande awk ou encore cut extraite un mot de ce fichier contenu par une commande listage :


    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
     
    ****************************************************************
     
    Liste
    TYPE = XXXXXXX
     
            EX        =                                        YYYY
            VER	  =                                            S
            DATE      =                                     20160601
            HEURE     =                                       134701
     
            EX        =                                     CUTAFAAQ
            VER       =                                            X
            DATE      =                                     20160601
            HEURE     =                                       134701
     
    ****************************************************************
    j'aimerais récupérer la valeur suivante : CUTAFAAQ

    et la mettre en argument d'une seconde commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ps -edf|grep MS|grep CUTAFAAQ
    De mon côté j'ai réussi à obtenir uniquement la deuxième colonne avec cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LISTE /tmp/RESS|awk '{print $3}'
    mais j'obtiens ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    XXXXXXX
     
    YYYY
    S
    20160601
    134701
     
    CUTAFAAQ
    X
    20160601
    134701
    il faudrait que je parvienne à récupérer le mot : CUTAFAAQ et le mettre dans ma seconde commande.

    Si quelqu'un peut m'aiguiller.

    Merci d'avance.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    Bonjour,

    pourquoi est-ce cette valeur qui t'intéresse ?
    ou plutôt, comment la distingues-tu des autres ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par sam01 Voir le message
    j'aimerais récupérer la valeur suivante : CUTAFAAQ
    et la mettre en argument d'une seconde commande :

    ...

    il faudrait que je parvienne à récupérer le mot : CUTAFAAQ et le mettre dans ma seconde commande.
    Facile pour moi!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mot=$(LISTE /tmp/RESS|awk '{print $3}' | fgrep 'CUTAFAAQ')
    ps -edf|grep MS|grep "$mot"
    PS: je crois que c'est la meilleure réponse possible aux spécifications fournies par l'utilisateur!

    et j'ai le secret espoir qu'elle puisse l'aider à réfléchir à la qualité desdites spécifications.

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    Par défaut
    Merci Jack-ft, mais j'ai oublié une spécification justement

    La valeur CUTAFAAQ n'est pas toujours identique... Par contre elle est toujours au même endroit et toujours le même nombre de caractère.

    Je sais, ça complexifie le script...

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Donc toujours la deuxième ligne 'EX =...' ?

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    Par défaut
    oui c'est bien ça

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Donc,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LISTE /temp/ress | awk '/EX *=/ && ++flag == 2 {print $NF}'
    devrait le faire.

  8. #8
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    Par défaut
    merci disedorgue. Je vais essayer demain. Tu pourrais juste m'expliquer cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '/EX *=/ && ++flag == 2 {print $NF}'

  9. #9
    Membre chevronné
    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
    Par défaut
    Salut,
    avec sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LISTE /temp/ress | sed -n '/EX/!b;:A;n;/EX/!bA;s/\(.* \)\(.*\)/\2/p;q'
    Cordialement.

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par sam01 Voir le message
    Tu pourrais juste m'expliquer cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '/EX *=/ && ++flag == 2 {print $NF}'
    Allez! J'm'y colle...

    La variable flag (comme son nom l'indique) représente le numéro de l'occurrence (ou le nombre d'occurrences) de la ligne susceptible de contenir la valeur cherchée.
    Au début, flag vaut 0 (valeur par défaut).

    /EX *=/ : si la ligne courante contient la chaine EX, suivie d'un nombre quelconque (éventuellement nul) d'espaces " *", suivie du signe =,
    && : et si...
    ++flag == 2 : après incrémentation de flag, sa valeur est égale à 2, alors c'est qu'on est sur la ligne qu'on cherche et, dans ce cas...
    {print $NF} : imprimer le dernier champ. La variable "awk" NF est une abréviation de "number of fields" et contient, pour la ligne courante, le nombre de champs de la ligne, ceux-ci étant des chaines séparées par des espaces. Du coup, $1 est le contenu du 1er champ, soit EX, $2 le contenu du 2ème champ, soit =, et $NF le contenu du 3ème et dernier champ, soit la valeur cherchée (et qui n'est imprimée sur la stdout que pour la seule 2ème occurrence).

    Pour les pinailleurs (dont je ne fais évidemment pas partie...), s'il n'y a aucune espace entre EX et =, le 1er champ devient EX= et le 2ème et dernier champ contient bien la valeur cherchée.

    Pour les super-pinailleurs (je vous laisse deviner qui...), s'il n'y a aucune espace de part et d'autre du signe =, le programme marche un peu moins bien...

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Merci Jack-ft pour l'explication...
    Pour les pinailleurs, une autre version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/EX *=/ && ++flag { FS="=" ; $0=$NF ; FS=" " ; $0=$NF } flag==2 && ++flag'

  12. #12
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    Par défaut
    merci pour l'explication jack-ft, mais j'ai un souci j'ai l'impression que le mot ressort vide.

    En mettant un set -x, j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ++ LISTE /temp/ress
    + awk /EX *=/ && ++flag == 2 {print $NF}
    mot=
    + ps -edf
    + grep MS
    + grep
    et pour le sed j'ai ce type d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    The label /EX/!b;:A;n;/EX/!bA;s/\(.* \)\(.*\)/\2/p;q is greater than eight chara
    en gros j'ai l'impression que ça ne marche par aucun des deux

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    le résultat doit être mis dans ta variable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot=$(LISTE /temp/ress | awk '/EX *=/ && ++flag { FS="=" ; $0=$NF ; FS=" " ; $0=$NF } flag==2 && ++flag')

  14. #14
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    Par défaut
    oui mais je code ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mot=$(LISTE /temp/ress | awk '/EX *=/ && ++flag { FS="=" ; $0=$NF ; FS=" " ; $0=$NF } flag==2 && ++flag')
    echo $mot
    l'echo me renvoie rien du tout...

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    et avec /tmp/RESS au lieu de /temp/ress ?

    Car dans le suivi des posts, on a perdu le nom de fichier de départ...

  16. #16
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 933
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 933
    Par défaut
    Salut, non non,c'est une erreur de mon copier-coller. L'echo me renvoie toujours rien...
    Je me demandais si ce n'est pas plus facile de parcourir le fichier ligne par ligne et de récuperer le mot voulu à la ligne voulue.

  17. #17
    Membre chevronné
    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
    Par défaut
    Salut,
    ça ressemble a un sed non GNU.
    The label is greater than eight chara
    essayer en mettant une commande par ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sed -n '/EX/!b
    :A
    n
    /EX/!bA
    s/\(.* \)\(.*\)/\2/p
    q'
    cordialement.

  18. #18
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Tu peux nous donner l'OS ?

    Et le résultat de la commande suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LISTE /tmp/RESS | od -c
    Sinon, un autre sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '1{x;s/.*/x/;x;};/EX[[:space:]=]*/{x;s/x//;x;t;s/.*[[:space:]=]//p;q;}' /tmp/RESS
    Ici, on récupére la 2ème ligne 'EX =', mais si on veut récupérer la 3ème, suffit juste de modifier:
    en
    En gros, dans cette partie on met autant de 'x' que le nombre de EX à ne pas prendre en compte.

  19. #19
    Membre chevronné
    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
    Par défaut
    Bonjour,
    ça peut être "simplifié" comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '1{x;s/.*/x/;x};/EX[[:space:]=]*/{x;s/x//;x;t;s/.*[[:space:]]//p;q}' /tmp/RESS
    En tous cas, merci, très instructif.

  20. #20
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Pour la regex finale, dans les 2 cas, s'il y a un espace (et/ou un '=' pour la mienne), ça ne fonctionnera pas...
    La regex la plus complète serait:
    Dans ce cas, ça fonctionne pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EX    =   TOTO
    EX=TOTO
    EX =TOTO
    EX= TOTO
    Et malheureusement aussi pour par exemple:
    On pourrait donc l'améliorer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^[[:space:]]*EX[[:space:]=]\+/
    Donc au final, cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -n '1{x;s/.*/x/;x;};/[[:space:]]*EX[[:space:]=]\+/{x;s/x//;x;t;s/^[[:space:]]*EX[[:space:]=]\+//p;q;}' /tmp/RESS
    PS: Faut vraiment garder l'habitude de laisser le ';' avant la fermeture d'un bloc '}' car la plupart des sed autre que gnu ne supporte pas cette absence.

Discussions similaires

  1. Extraction et mise en forme des données d'un tableau
    Par Patrice.peace dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2012, 22h17
  2. Mise à jour DataBase sur base du DataSet et Erreur Arguments trop nombreux
    Par Rifton007 dans le forum Accès aux données
    Réponses: 3
    Dernier message: 26/03/2009, 20h55
  3. Réponses: 5
    Dernier message: 09/02/2009, 13h14
  4. [MySQL] Extraction champs puis mise à jour simultanée
    Par Antherak dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 28/09/2008, 15h03
  5. [VBA Excel] Extraction de données fichier txt vers Excel et mise en forme
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/05/2008, 11h45

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