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 :

Intégrer un "| grep" dans awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Points : 57
    Points
    57
    Par défaut Intégrer un "| grep" dans awk
    Bonjour,

    actuellement j'ai un fichier composé de ce type de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fichier tmp/plik :
     
    toto titi tuto tata taktak (plik)
    toto titi tutr tata taktak (plik2)
    toto titi tutf tata taktak (plik3)
    toto titi tuto tata taktak (plik4)
    toto titi tuto tata taktak (plik5)

    je voudrais récupérer le 6ème champs comme argument pour un script et comme motif pour un grep, le tout lancer via awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '$0 ~ /tuto/ {gsub(/\(|\)/,"",$0); c=("/tmp/script.sh "$6" |grep " $6); print c; while(c|getline ok>0) print ok; close(c)}' /tmp/plik
    Le problème est que j'ai l'impression que le pipe n'est pas interprété correctement, faut-il donc le protéger ou faire une autre manip pour qu'il soit correctement exécuté ? Merci à vous.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    tu as déjà vu la créature de Frankenstein ?
    c'est ce que je vois, là.

    sors le pipe du awk.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    En gros, tu appelles awk essentiellement pour lancer des commandes externes
    Si c'est seulement pour t'exercer, il faudrait que tu utilises, pour récupérer la sortie de la commande "/tmp/script.sh " $6 " | grep " $6 dans la variable c, la même syntaxe que tu utilises plus loin pour récupérer la sortie de la commande c dans la variable ok, à savoir "/tmp/script.sh " $6 " | grep " $6 | getline c (ou bien une boucle tant que cette commande renvoie des lignes).

    Mais sinon, il vaudrait mieux faire un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read pattern; do/tmp/script.sh "$pattern" | grep "$pattern"done < <(awk -F'[()]' '/tuto/{print $2}' /tmp/plik)

  4. #4
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Points : 57
    Points
    57
    Par défaut
    Bon je pensais que l'on pouvait construire une commande avec un grep dans un awk mais apparemment non, en tout cas merci pour infos, sinon en cherchant j'ai pu bricoler une commande qui à l'air de fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (cat /tmp/plik | awk -F'[()]' '/tuto/; print "/tmp/script.sh "$6 " | grep -i "$6}' )| while read A; do echo "$A"|sh; done
    Mais bon autant faire un while read comme suggéré par balkany

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    on t'a déjà fait la remarque sur le cat.
    et un sous-shell est inutile, pour grouper des commandes, utilise simplement des accolades.

    avec du codage comme ça, tu vas finir par faire se bouffer la queue au serpentin.

    apprends à rédiger des algorithmes avant de coder.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Points : 57
    Points
    57
    Par défaut
    Désolé c'est les mauvaises habitudes

    quand tu parles de sous shell tu fais référence au "|sh" ? C'est vrai que je l'utilise pas mal pour lancer des commandes à la va vite, mais il y-a-t-il un effet pervers à ce type de pratique ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    non, je parle des parenthèses.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    De toute façon il n'y a rien à regrouper.
    cat : 1 entrée, une sortie.
    awk : 1 entrée, une sortie.
    while: 1 entrée, une sortie.


    D'autre part, pourquoi envoyer à "sh" ? Fais-tu un eval, sans le dire ? Eval is evil. (Les humoristes anglophones se régalent.)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par sedawk Voir le message
    Bon je pensais que l'on pouvait construire une commande avec un grep dans un awk mais apparemment non
    Si, techniquement on peut, mais ça n'est pas une bonne idée.
    Soit on appelle grep en dehors de awk, soit on reste dans awk, et on utilise les outils propres au langage pour filtrer.
    Si vraiment tu veux exécuter ta commande dans awk, si j'ai bien suivi, ça donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[()]' '/tuto/{system("/tmp/script.sh " $2 " | grep -i " $2)}' /tmp/plik

  10. #10
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Points : 57
    Points
    57
    Par défaut
    Hello Flodelarab,

    j'utilise le | sh comme pour faire un "bash monscript.sh" (enfin je suppose que cela fait la même chose ?)

    Balkany : c'est ça que je cherchais à faire ne effet

  11. #11
    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
    En général, on parle de "source" ou "." pour sourcer les fichiers.
    Pour en savoir plus, ou Ton code écrit comme tu le fais crée un sous-processus et les variables modifiées par ton fichier sourcé ne seront modifiées que dans le sous-processus. On préférera une syntaxe du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read fic;do . "$fic"; done < <(script_qui_fournit_la_liste_des_fichiers_a_sourcer.bash)
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ ls
    a.bash  b.bash  c.bash
    $ grep -nH '' *.bash
    a.bash:1:#!/bin/bash
    a.bash:2:
    a.bash:3:a=7
    b.bash:1:#!/bin/bash
    b.bash:2:
    b.bash:3:a=9
    c.bash:1:#!/bin/bash
    c.bash:2:
    c.bash:3:a=11
    $ a=5;while read fic;do . "$fic"; done < <(for i in a b c; do echo "$i.bash"; done); echo $a
    11
    Pas de conduite (pipe) donc pas de sous-processus, donc "a" est modifiée.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    bah.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk ... |xargs -I_ sh -c 'script "$1" | grep "$1"' _ sh
    quitte à faire propre...

    et encore, je ne suis pas certain que le sh soit indispensable : on peut peut-être se contenter de grepper la sortie de xargs.

    parce qu'on peut faire tenir un éléphant sur sa trompe, le dompteur aura l'air talentueux, mais l'éléphant, lui, aura l'air bête (pour rester poli).
    mais ce sera un tortionnaire, et un Q en l'air.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    T'as une petite erreur là, non ? Ou alors je comprends pas une subtilité ?
    C'est pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk ... |xargs -I_ sh -c 'script "$1" | grep "$1"' _ _
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk ... |xargs -Ish sh -c 'script "$1" | grep "$1"' _ sh
    mais pourquoi sh (comme chaine à remplacer) ?

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Une autre façon sympa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ bash -c "$(echo -e "foo bar\nfoo foobar" | awk '/foo/ {print "echo "$2" | grep "$2}')"
    bar
    foobar
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    mais pourquoi sh (comme chaine à remplacer) ?
    pfff. je me suis trompé, bien sûr.

    sh doit être le premier paramètre passé à sh (pour être assigné à $0) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk ... |xargs -I_ sh -c 'script "$1" | grep "$1"' sh _
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Ah ben oui, j'avais même pas pensé à intervertir les deux paramètres !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/04/2011, 14h37
  2. AWK, probleme de quote dans fonction awk.
    Par damien_27 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 18/03/2009, 18h51
  3. Quote dans une requete...
    Par Isildur dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/06/2006, 10h57
  4. Quotes dans TFilenameEdit (RXLib)
    Par AnnSo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 23/01/2003, 20h26

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