Tube awk | mysql

Résolu
loloviolo -  
loloviolo Messages postés 12 Date d'inscription   Statut Membre -
Bonjour,

Je crois que mysql accepte les tubes mais je ne sais pas trop comment m'y prendre. Voila le code :
Code :

tail -n 100 /fichier_a_ajouter | awk '/markers/{print $1 $7}' | mysql -h localhost -u user -ppassword mailing -e 'INSERT INTO event (hash, ip) VALUES ("testhash", $1)'

Merci de votre aide.

LoLoVioLo

10 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    oui, mais je suppose que l'input doit être au format sql. je verrais plutôt:

    tail -n 100 /fichier_a_ajouter | awk '/markers/{print 'INSERT INTO event (hash, ip) VALUES (\"testhash\"," $1 $7}' | mysql -h localhost -u user -ppassword ...
    0
  2. loloviolo Messages postés 12 Date d'inscription   Statut Membre 20
     
    Nickel ca marche !

    Ca parrait effectivement plus logique. Vu l'heure de mon post, j'ai des circonstances attenuantes :-)

    Merci dubcek
    0
  3. loloviolo Messages postés 12 Date d'inscription   Statut Membre 20
     
    J'en profite pour poser un autre problème. $7 est en fait une URL de type /dos1/dos2/fichier.html

    Comment entrer dos2 et fichier (sans .html) dans ma base toujours avec le même commande.

    J'ai essayé awk mais comme je suis déjà dans un awk, ça passe pas.
    J'ai essayé split, ça va pas non plus.
    J'ai aussi pensé à appeler awk avec l'option -F mais elle n'accepte qu'un seul séparateur

    Merci de votre aide.

    LoLoVioLo
    0
  4. dindoun Messages postés 1047 Statut Membre 135
     
    salut
    tu peux peut être essayer en incluant un deuxième awk dans des `` ( guilletmets altgr 7 )
    et donc à la place de $7 tu mets
     `echo $7 | awk 'blah{blah}' `
    0
    1. loloviolo Messages postés 12 Date d'inscription   Statut Membre 20
       
      Merci pour l'idée mais j'ai beau essayer dans tous les sens, ça ne marche pas
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    echo /dos1/dos2/fichier.html | awk -F'/\.' '{print $3, $4}'
    0
    1. loloviolo Messages postés 12 Date d'inscription   Statut Membre 20
       
      Merci de ton aide dubcek

      Malheureusement, cette methode ne fonctionne pas. Comme je le disais plus haut, awk semble n'accepter en option -F qu'un caractere ou chaine.

      Dans ton cas, il m'affiche un avertissement ( echapement \. traité comme . seulement ) prend donc en compte /. comme separateur et decoupe en os1, os2 et ichier.html (le point etant evalué comme n'importe que caractere)
      0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Je pense que l'expression de dubcek doit s'écrire plutôt comme ça (sans espace après le crochet ouvrant et avant le crochet fermant) :
    awk -F'[ /\. ]' '{print $3, $4}'
    C'est une mauvaise interprétation de ces caractères par la syntaxe interne à CCM qui transforme les expressions entourées par des crochets en lien ;-((
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      juste, merci
      0
  8. loloviolo Messages postés 12 Date d'inscription   Statut Membre 20
     
    Merci à tous - Ca marche !
    0
  9. loloviolo Messages postés 12 Date d'inscription   Statut Membre 20
     
    Ahhhh ca devient un vrai casse-tete ce script.

    Ca devrait marcher ... et pourtant .... enlevez les espaces dans [ /\. ]

    tail -f /var/log/httpd/VLOG-2008-11-monsite.com.log | awk -v event_date="$(date '+%Y-%m-%d %H:%M:%S')" '/markers/{print $1$7"/"event_date}' | awk -F [ /\. ] '//{print "INSERT INTO event (event_date, ip, camp, user, hash, status) VALUES (\""$11"\", \""$1"."$2"."$3"."$4"\", "$7", "$8", \""$9"\", \"READ\");"}' | mysql -h localhost -u user -ppassword table

    enlevez les espaces dans [ /\. ]

    Le script marche bien avec tail -n 100
    INSERT INTO event (event_date, ip, camp, user, hash, status) VALUES ("2008-11-05 02:50:50", "90.8.70.76", 1, 1, "4884f1e54bc4e21a51b46cff8d37bd9fbd217b51", "READ");

    Le script marche aussi avec le tail -f si je m'arrete au premier awk : tail -f /var/log/httpd/VLOG-2008-11-monsite.com.log | awk -v event_date="$(date '+%Y-%m-%d %H:%M:%S')" '/markers/{print $1$7"/"event_date}'
    90.8.70.76/mailing/markers/1/1/4884f1e54bc4e21a51b46cff8d37bd9fbd217b51.gif/2008-11-05 02:52:30


    Problemes :

    1- La date reste toujours la meme (date du debut d'execution)

    2- Le script complet avec le tail -f ne retourne rien

    Merci de votre aide.

    LoLoVioLo
    0
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    1 c'est normal, la commande date est exécutée au démarrage de awk. pour que la date soit recalculée à chaque ligne, il faut dans le awk, quelque chose comme awk 'system("date"); ...
    0
  11. loloviolo Messages postés 12 Date d'inscription   Statut Membre 20
     
    Voilà mon script est fini ! Merci à tous pour votre aide (surtout dubcek)

    Pour info, je ne sais toujours pas pourquoi chaque pipe fonctionne independement mais pas l'ensemble. J'ai finalement utilisé une fonction que j'appelle depuis mon awk. Ainsi la date est bien rafraichie et j'ai jamais plus de 2 pipes par ligne.

    Je vous conseille la lecture du super post de drl sur unix.com

    https://www.unix.com/shell-programming-and-scripting/49026-external-function-awk.html
    0