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 :

SQL - BASH - Read variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 61
    Par défaut SQL - BASH - Read variable
    Bonjour a tous,

    J'ai besoin de votre aide. J'ai une requete SQL qui est lie dans un programme bash. Et je voudrais que le resultat de cette requete (1 colonne avec plusieurs lignes) soit entre dans une variable pour qu'ensuite je puisse boucler sur cette variable.

    Voila ce que mq requete me retourne :

    --------------
    select id from product where market_id in (52500,54852,9666) and country_id in (1,2,3);
    --------------

    +------------+
    | id |
    +------------+
    | 5420707 |
    | 5425002 |
    | 7353684 |
    | 7353686 |
    | 7743180 |
    | 8109432 |
    +------------+
    6 rows in set (0.00 sec)

    Bye


    Et ce que je voudrais c'est recuperer uniquement les id dans une variable et boucler dessus afin de les utiliser dans la suite du script un par un.
    Pouvez vous m'aider ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    sed devrait être suffisant pour répondre à ton problème.
    1. Ne prendre que les lignes qui contiennent seulement des chiffres, l'espace et le trait vertical.
    2. Dans ces lignes, supprimer toutes les occurrences de l'espace et du trait vertical.

    Et plutôt que mettre le résultat dans une variable pour boucler dessus, utiliser directement le résultat de cette commande pour alimenter la boucle de traitement des identifiants.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éprouvé Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Par défaut
    Une autre possibilité avec awk.
    J'ai mis le résultat de ta requête SQL dans le fichier sql.out.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #!/bin/sh
     
    cat sql.out | awk '$1 == "|" && $2 != "id" {print $2}'

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Avec juste grep et read, tu peux lancer une commande sur chaque id en traitant directement ce qu'affiche ta commande SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma commande SQL | grep  '^[0-9 |]*$' | while read s1 id s2 ; do commande avec "${id}" ; done
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

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

    il y a une option mysql pour ne pas afficher autre chose que les données (les en-têtes, le cadre, les stats) !
    il faut lire le man.

    si tu es certain qu'il n'y a pas d'espaces dans les données, alors tu peux mettre la commande mysql dans un substitution de commande de façon à alimenter un tableau.
    ensuite tu boucleras sur les éléments du tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table=( $(mysql ...) )
    for i in "${table[@]}"; do : peu importe; done
    on peux même passer l'étape du tableau, et directement boucler sur chaque ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql ... | while read line; do : peu importe; done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Tout d'abord un rappel: La mise en forme en console et les données lorsqu'on redirige vers un fichier ou un pipe n'est pas la même !
    Donc on n'a pas à repérer les traits verticaux.

    Ensuite, retraiter les identifiants un par un n'est pas un énoncé suffisant.
    Si tu transformes un texte en texte, je conseille de rester avec grep/sed/awk.
    Mais si tu a besoin d'un wget ou ping ou autre chose, sans doute faudra-t-il une boucle "while read ligne; do ... done".

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 61
    Par défaut
    Merci a tous !

    Cependant, il me reste un petit souci. J'ai decide de garder la solution de all_24 ci-dessous mais cela me trouve 3 valeurs nulles avant et 1 apres dans la boucle do

    ma commande SQL | grep '^[0-9 |]*$' | while read s1 id s2 ; do commande avec "${id}" ; done
    Nom : screen.png
Affichages : 358
Taille : 3,2 Ko

    Auriez vous une idee pour que ce ne soit que les lignes des chiffres prises en compte ?

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Oui. Au lieu de demander 0 ou +, demande 1 ou +.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma commande SQL | grep '^[0-9]\?$' | while read s1 id s2 ; do commande avec "${id}" ; done

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 61
    Par défaut
    Maintenant cette commande me retourne que des lignes vides.

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Essaye avec '^[| ]+[0-9]+[| ]+$' comme expression de recherche.
    (Je ne peux pas tester, je n'ai pas d'environnement shell ?nix sous la main)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,
    Citation Envoyé par al1_24 Voir le message
    Essaye avec '^[| ]+[0-9]+[| ]+$' comme expression de recherche.
    (Je ne peux pas tester, je n'ai pas d'environnement shell ?nix sous la main)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep -o '[[:digit:]]{3,}'

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 61
    Par défaut
    Le code ci-dessous me retourne aucune ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mysql commande | grep '^[| ]+[0-9]+[| ]+$' | while read s1 id s2 ; do echo ${id} ; done
    Et ce code ci, me retourne que des lignes vides :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql commande | egrep -o '[[:digit:]]{3,}' | while read s1 id s2 ; do echo ${id} ; done
    Peut etre que l'erreur vient d'autre part ?

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 61
    Par défaut
    J'ai egalement essaye avec cette commande, cependant il reste un leger probleme. Quand la query est execute, cela affiche la commande " select id from product where market_id in (52500,54852,9666) and country_id in (1,2,3); " et donc ces nombres la sont pris en compte dans la boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     egrep -o '[[:digit:]]{3,}' | while read line ; do echo $line ; done

  14. #14
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Bonjour,

    Si ton grep supporte les regex perl, essayes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Po '^\| *\K[[:digit:]]{3,}' | while read line ; do echo $line ; done

  15. #15
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    @ca_adrien
    Il s'agirait de commencer à comprendre ce que tu fais !


    • La commande que j'ai proposée retourne des lignes vides car tu mets l'identifiant dans s1 et demande d'afficher id. Donc ligne vide.
    • La commande proposée par al1_24 ne renvoie rien car le + (pour "1 ou +") n'est pas échappé par contre oblique. Donc c'est un vrai +. Aucune ligne n'a ce motif. Aucune ligne n'est retournée.
    • La commande de zipe31 a le même comportement que la mienne. Il voit le motif, et toi, ca_adrien, tu demandes d'afficher une variable vide. Donc affichage de lignes vides.

  16. #16
    Membre éprouvé Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Par défaut
    Heuh ... Mon awk, il marchait. Je l'ai testé dans ma Debian Jessie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #!/bin/sh
    for i in $(ta requete SQL | awk '$1 == "|" && $2 != "id" {print $2}')
    do
        ton traitement utilisant $i
    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    mais pourquoi ne pas appeler mysql avec la bonne option afin qu'il n'affiche pas le cadre et les stats !?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Citation Envoyé par RaphaelG Voir le message
    Heuh ... Mon awk, il marchait. Je l'ai testé dans ma Debian Jessie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #!/bin/sh
    for i in $(ta requete SQL | awk '$1 == "|" && $2 != "id" {print $2}')
    do
        ton traitement utilisant $i
    done
    Jusqu'à ce que ta ligne sql renvoie un espace dans l'enregistrement et le "for" va fortement dysfonctionner.

Discussions similaires

  1. [SQL] Concaténation de variables
    Par dogi dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 01/11/2005, 20h49
  2. Recuperer un enregistrement de requete SQL dans une variable
    Par kleenex dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/09/2005, 15h59
  3. java.sql.SQLException: read-only
    Par mehdi.kiwi dans le forum Oracle
    Réponses: 6
    Dernier message: 17/05/2005, 16h46
  4. script SQL : affectation de variables
    Par Laura dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/10/2003, 21h32
  5. Transact Sql : Conversion de variable
    Par lord_paco dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/08/2003, 13h25

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