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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    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 émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    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 confirmé
    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
    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 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    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 confirmé
    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
    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
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    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

  8. #8
    Membre confirmé
    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
    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

+ 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