Tube awk | mysql

Résolu
loloviolo -  
loloviolo Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

10 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
loloviolo Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   20
 
Nickel ca marche !

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

Merci dubcek
0
loloviolo Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   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
dindoun Messages postés 1028 Date d'inscription   Statut Membre Dernière intervention   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
loloviolo Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   20
 
Merci pour l'idée mais j'ai beau essayer dans tous les sens, ça ne marche pas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
echo /dos1/dos2/fichier.html | awk -F'/\.' '{print $3, $4}'
0
loloviolo Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
juste, merci
0
loloviolo Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   20
 
Merci à tous - Ca marche !
0
loloviolo Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
loloviolo Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   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