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 :

Sed et Regex


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut Sed et Regex
    Bonjour, je cherche à récupérer une chaîne de caractère dans un fichier en fonction d'un pattern, cependant avec la commande sed je n'y parvient pas
    Je dois récupérer les chaines : bdd_name, my_user et my_pass

    Le contenu du fichier :
    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
    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'bdd_name',
          'username' => 'my_user',
          'password' => 'my_pass',
          'host'     => 'localhost',
          'port'     => '',
          'driver'   => 'mysql',
          'prefix'   => 'adom_',
        ),
      ),
    );
    Ma commande de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -ne "/      ''database' => '(.*)'/p" settings.php

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

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

    Une version sed et une version awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed -ne "/database/s/.*'\(.*\)'.*/\1/p" settings.php
    bdd_name
    $ awk -F\' '/\<database\>/{print $4;}' settings.php
    bdd_name

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    et une version Perl en prime :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ perl -lne "print \$1 if /'(?:database|username|password)' => '(.+?)',/" fichier
    bdd_name
    my_user
    my_pass

  4. #4
    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 @ tou(te)s,

    Et une avec grep, ça vous dit ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -Po "(database|username|password)'[^']*'\K[^']*"  fich 
    bdd_name
    my_user
    my_pass

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

    Reste plus que la version builtin :
    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
    $ cat setting.php 
    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'bdd_name',
          'username' => 'my_user',
          'password' => 'my_pass',
          'host'     => 'localhost',
          'port'     => '',
          'driver'   => 'mysql',
          'prefix'   => 'adom_',
        ),
      ),
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ $(echo -e "ZXZhbCB3aGlsZSBJRlM9XCcgcmVhZCBhIGEgYiBiIGM7IGRvIGNhc2UgJGEgaW4g\nZGF0YWJhc2V8dXNlcm5hbWV8cGFzc3dvcmQpIGVjaG8gJGIgOzsgZXNhYyA7IGRv\nbmU8Cg==" | openssl enc -d -a ) setting.php 
    bdd_name
    my_user
    my_pass

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    +1 mais vraiment parceque c'est sale

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut
    Merci pour votre aide ça fonctionne plutôt bien, une question supplémentaire, si la sortie de la commande sort plusieurs résultat, est-il possible de préciser de ne récupérer que le dernier résultat ?

    Avec un fichier su style :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     * @code
     *   $databases['default']['default'] = array(
     *     'driver' => 'mysql',
     *     'database' => 'databasename',
     *     'username' => 'username',
     *     'password' => 'password',
     *     'host' => 'localhost',
     *     'prefix' => '',
     *   );
     *   $databases['default']['default'] = array(
     
     *     'driver' => 'pgsql',
     *     'database' => 'databasename',
     *     'username' => 'username',
     *     'password' => 'password',
     *     'host' => 'localhost',
     *     'prefix' => '',
     *   );
     *   $databases['default']['default'] = array(
     *     'driver' => 'sqlite',
     *     'database' => '/path/to/databasefilename',
     *   );
     * @endcode
     */
    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'bdd_name',
          'username' => 'my_user',
          'password' => 'my_pass',
          'host'     => 'localhost',
          'port'     => '',
          'driver'   => 'mysql',
          'prefix'   => 'adom_',
        ),
      ),
    );

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    je reprends mon exemple Perl et en m'en tenant au fichier que tu montres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -lne "print \$1 if /^ *'(?:database|username|password)' => '(.+?)',/" fichier

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    je reprends mon exemple Perl et en m'en tenant au fichier que tu montres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -lne "print \$1 if /^ *'(?:database|username|password)' => '(.+?)',/" fichier
    Merci de ta réponse cela fonctionne parfaitement, pour ma culture j'aimerais comprendre quelle partie de la commande permet de ressortir seulement les derniers résultats.

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

    BufferBob se base juste sur le cas des ligne qui commencent par des espaces ou par un quote...

    En fait, le plus propre serait de récupérer le dernier bloc databases .... ( .... ); et à partir de là de récupérer les valeurs désirées.

    Est-ce que dans chacun de tes blocs , tu as les champs que tu désirs récupérer ?

  11. #11
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    BufferBob se base juste sur le cas des ligne qui commencent par des espaces ou par un quote...
    ou dit autrement on s'occupe pas des lignes commentées si tu préfères (dont le premier caractère sera en général une étoile *)
    sinon la partie de la commande qui permet de ressortir machin, c'est facile, je l'ai mise en rouge exprès dans mon précédent post : ^ * (la ligne commence par "zéro espace ou plus", suivi ensuite de 'database etc.)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    ou dit autrement on s'occupe pas des lignes commentées si tu préfères (dont le premier caractère sera en général une étoile *)
    sinon la partie de la commande qui permet de ressortir machin, c'est facile, je l'ai mise en rouge exprès dans mon précédent post : ^ * (la ligne commence par "zéro espace ou plus", suivi ensuite de 'database etc.)

    Je n'ai pas fait attention à la colorisation , j'ai compris l'exclusion des lignes commençant par *, par contre la regex bypass automatiquement les espaces qui suivent ?

  13. #13
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Hellgast Voir le message
    Je n'ai pas fait attention à la colorisation , j'ai compris l'exclusion des lignes commençant par *, par contre la regex bypass automatiquement les espaces qui suivent ?
    hmm.. bon au temps pour moi, ma précision visait à désambiguïser si besoin et a finalement l'effet inverse je crois
    la regex "n'exclue pas les lignes commençant par *", elle "traite uniquement les lignes qui commencent par zéro ou plusieurs espaces" avant la première quote 'machin
    ^ indique qu'on cherche à matcher depuis le début de la ligne, <espace>* signifie "zéro espace ou plus"

    Citation Envoyé par disedorgue Voir le message
    Est-ce que dans chacun de tes blocs , tu as les champs que tu désirs récupérer ?
    c'est une bonne question

  14. #14
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour,

    et ce fichier est en fait un fichier source php pour drupal
    et donc il peut être aussi directement interprété en php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    include "settings.php";
    print_r(["default"]["default"]);
     
       >Array
       >(
       >    [driver] => mysql
       >    [database] => drupaldb
       >    [username] => username
       >    [password] => secret
       >    [host] => dbserver1
       >)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php -n -r 'include "config.php"; echo $databases["default"]["default"]["username"];'
    ps: l'utilité de récupérer des passwords d'une base de donnée ? je suis septique

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

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


    La fosse est septique, dû à son état de putréfaction.
    Toi, tu dois être sceptique.
    À moins que ?...


  16. #16
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    +1 Flodelarab
    disons que je ne le sens pas

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour,

    et ce fichier est en fait un fichier source php pour drupal
    et donc il peut être aussi directement interprété en php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    include "settings.php";
    print_r(["default"]["default"]);
     
       >Array
       >(
       >    [driver] => mysql
       >    [database] => drupaldb
       >    [username] => username
       >    [password] => secret
       >    [host] => dbserver1
       >)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php -n -r 'include "config.php"; echo $databases["default"]["default"]["username"];'
    ps: l'utilité de récupérer des passwords d'une base de donnée ? je suis septique

    L'utilité, dans mon cas, est de faire un script de mise en prod + maj de la préprod sur une environnement Drupal, ce qui comprend une sauvegarde de la prod et de la preprod et une maj de la bdd sur la préprod, cette commande me servira à générer un mysqldump + maj de façon automatique et ainsi éviter les erreurs.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    hmm.. bon au temps pour moi, ma précision visait à désambiguïser si besoin et a finalement l'effet inverse je crois
    la regex "n'exclue pas les lignes commençant par *", elle "traite uniquement les lignes qui commencent par zéro ou plusieurs espaces" avant la première quote 'machin
    ^ indique qu'on cherche à matcher depuis le début de la ligne, <espace>* signifie "zéro espace ou plus"


    c'est une bonne question
    Ah oui exact, pour le caractère * je pensais qu'il correspondait au caractère de commentaire, mais avec ta précision tout est clair, si mes souvenirs sont bons il faut échapper ce même caractère si l'on veut l'utiliser comme un caractère simple.
    En tout cas merci pour toutes les réponses apportées.

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

Discussions similaires

  1. [Shell scripting] Question sur sed et regex
    Par Antheadousa dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 29/05/2014, 10h37
  2. Comment faire des remplacements dans des fichiers (sed + regex)
    Par vinok972 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 04/12/2012, 12h50
  3. [regex] substitution avec sed
    Par tiresias54 dans le forum Linux
    Réponses: 6
    Dernier message: 26/04/2012, 16h26
  4. [SED] [REGEX] : caractères interprétables
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 22/10/2010, 17h15
  5. Réponses: 4
    Dernier message: 28/04/2009, 12h38

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