Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/02/2008, à 10:52

insomniak

récupérer stderr et stdout de wget : impossible ?

Bonjour à  tous,

Dans le cadre d'un script, je suis amené à  recupérer une floppée de fichiers sur un de mes serveurs (doit y'en avoir dans les 15-20k fichiers, donc ca fait du monde).
Il peut y avoir des erreurs et j'aimerai pouvoir séparer ceux qui merdouillent de ceux qui se sont bien téléchargés. Or si je fais ceci :


wget -N -nv http://www.monserveur.com/index.php 1>out.txt 2>err.txt

Que le fichier soit là  ou pas, il me mettra tous les messages dans err.txt (donc si il le télécharge bien, ou si il m'indique une erreur 404, c'est pareil, il met les messages dans err.txt)

Comment pourrais-je faire pour avoir seulement les erreurs dans err.txt ?

Edit : à  défaut d'avoir les erreurs complètes, au moins savoir quel fichier n'a pas été téléchargé m'arrangerait vachement en fait ^^

Merci par avance
@ bientot

Dernière modification par insomniak (Le 06/02/2008, à 11:57)

Hors ligne

#2 Le 06/02/2008, à 12:57

Pere Collateur

Re : récupérer stderr et stdout de wget : impossible ?

Essaye ceci:

wget -N -nv http://www.monserveur.com/index.php 2>&1|tee out.txt


--

Windows est déjà mort, mais il ne le sait pas encore!

Hors ligne

#3 Le 06/02/2008, à 13:11

insomniak

Re : récupérer stderr et stdout de wget : impossible ?

Tu rediriges le stderr dans stdout or, wget balance tous ses messages (quelle que soit la réponse) dans stderr.
Le résultat de ta commande : je récupère tous les messages. Qu'il télécharge ou bien qu'il soit en 404 sad
Merci quand meme

Hors ligne

#4 Le 06/02/2008, à 13:19

Coolgeek

Re : récupérer stderr et stdout de wget : impossible ?

peux tu mettre une ligne de stderr quand le tu recup le fichier et quand il y'a une erreur ?

Hors ligne

#5 Le 06/02/2008, à 13:33

insomniak

Re : récupérer stderr et stdout de wget : impossible ?

CoolGeek : je te vois venir, en gros on parse le retour complet pour en tirer uniquement les erreurs ^^
En gros, il faut parser ERROR mais le truc c'est que je ne suis pas sur qu'il n'y ait que ce genre d'erreur là  à  zyeuter...
Bref, dans tous les cas, il renvoie ERROR suivi de 404 (ou autre nombre representant l'erreur)
Voici le format exact du retour :

http://www.monserveur.com/index.htms:
12:32:05 ERROR 404: Not Found.

That's all
PS : justement, j'avais pensé récupérer en fonction de ERROR mais je ne sais pas comment on fait pour récup la ligne du dessus... en gros, j'avais essayé avec un grep ERROR et il ne me renvoyais que la ligne de l'erreur pas celle du fichier en question sad

Hors ligne

#6 Le 06/02/2008, à 15:09

Aurel34

Re : récupérer stderr et stdout de wget : impossible ?

c'est juste une idée, mais est-ce que tu as essayé avec curl au lieu de wget ?

#7 Le 06/02/2008, à 15:17

Coolgeek

Re : récupérer stderr et stdout de wget : impossible ?

effectivement c'est ce que je voulais faire...

Il faudrait surement passer par un script...

Hors ligne

#8 Le 06/02/2008, à 15:40

insomniak

Re : récupérer stderr et stdout de wget : impossible ?

Aurel34 : j'ai regardé Curl mais il y a un problème...
Curl par défaut te renvoie la page (du moins la sortie de la page appelée, donc le source html grosso modo)
Pour télécharger effectivement le fichier, il faut faire un -o nomfichier qui va enregistrer ce qu'il reçoit dans nomfichier
Or si je tombe sur une erreur 404, il ne me leve pas d'erreur mais va m'inscrire l'erreur 404 dans le fichier. Donc en gros, t'as l'impression d'avoir dl le fichier alors que son contenu est faux...

Coolgeek : comment recuperer la ligne du dessus à  ton avis ?

Hors ligne

#9 Le 06/02/2008, à 16:18

Coolgeek

Re : récupérer stderr et stdout de wget : impossible ?

d'apres le man, l'option -B pertmet d'afficher x lignes qui se trouve AVANt la ligne.

donc avec :

wget -N -nv http://www.monserveur.com/index.php | grep -B 1 ERROR > err.txt


ca devrait aller

essaye de changer le chiffre apres le -B afin de remonter plus haut.

Hors ligne

#10 Le 06/02/2008, à 16:54

insomniak

Re : récupérer stderr et stdout de wget : impossible ?

Merci coolgeek
Par contre je me posais une question :
Quand on fait un grep et qu'on balance le resultat dans un fichier par exemple, imaginons que je veuille envoyer deux choses de ce grep, la ligne N et la ligne N-1
Comment fais tu pour faire un truc du genre :

wget -N -nv http://www.monserveur.com/index.php | grep (-B 0 AND -B -1) ERROR > err.txt

En fait je souhaiterai récupérer ces deux lignes et les concatener par exemple.

Merki

Hors ligne

#11 Le 06/02/2008, à 17:02

freebird

Re : récupérer stderr et stdout de wget : impossible ?

wget -N -nv http://www.monserveur.com/index.php | grep -B 1 ERROR > err.txt

Tu auras la ligne avec ERROR et la ligne d'au dessus.

Hors ligne

#12 Le 06/02/2008, à 17:03

Coolgeek

Re : récupérer stderr et stdout de wget : impossible ?

le -B envoye la ligne qui correspond au GREP ainsi que les x lignes d'avant.

Malheureusement, je ne sais pas comment faire pour enlever le saut de ligne... a part avec sed, mais pas sur.

Hors ligne

#13 Le 06/02/2008, à 17:16

freebird

Re : récupérer stderr et stdout de wget : impossible ?

Petite proposition pour récupérer les 2 lignes voulues en les affichant sur 1 seule avec un gawk :

wget -N -nv http://www.monserveur.com/index.php | gawk ' /ERROR/ { printf("%s %s\n", ligneprec, $0) }; {ligneprec=$0}' > err.txt

Hors ligne

#14 Le 06/02/2008, à 18:14

insomniak

Re : récupérer stderr et stdout de wget : impossible ?

Lut Freebird

Par rapport à  ta suggestion, ok, mais je ne connais pas du tout gawk donc on va dire que j'apprend sur le tas.
Il manque tout d'abord un 2>&1 avant le pipe pour pouvoir récupérer le resultat avec le ERROR dans le pipe sinon il ne prend que le stdout (wget ne renvoie que dans stderr)
pour le gawk : dis moi si je me trompe :
Si on trouve ERROR dans la ligne en cours, on affiche la ligne précédente suivie d'un espace suivi de la ligne en cours ($0)
Si on n'est pas sur la ligne ou il y a ERROR, on stocke dans la variable ligneprec la ligne en cours

C'est ça ? Si oui, je pense qu'il conserve le retour à  la ligne de la premiere ligne (donc ligneprec), faut que je trouve le moyen de le supprimer
Merci

Edit : en fait, je suis en train de me dire que le plus simple serait de supprimer le retour chariot du retour de wget si on trouve le mot ERROR dedans... ça serait plus simple je crois

Dernière modification par insomniak (Le 06/02/2008, à 18:19)

Hors ligne

#15 Le 06/02/2008, à 21:01

freebird

Re : récupérer stderr et stdout de wget : impossible ?

Tu as tout compris sur le fonctionnement du gawk utilisé ici.

Pour info je n'ai pas de quoi tester les syntaxes que je vous passe donc il peut y avoir des loupés comme la redirection wink
Tu as une ligne vide entre le nom de la page et la ligne d'erreur ? Si c'est le cas il suffit de faire :

wget -N -nv http://www.monserveur.com/index.php 2>&1 | gawk ' /ERROR/ { printf("%s %s\n", ligneprec, $0) }; NF>0 {ligneprec=$0}' > err.txt

NF = le nombre d'informations sur la ligne
NF>0 revient à  dire qu'on ne traite la ligne que si elle n'est pas vide

Hors ligne

#16 Le 06/02/2008, à 22:03

insomniak

Re : récupérer stderr et stdout de wget : impossible ?

non non il n'y a pas de ligne vide, en gros la sortie est sous cette forme :

Lien vers le fichier
ERROR 404

C'est tout. Et avec ta commande ça ne passe pas, ça me renvoie la meme chose... comprend pas pourquoi o_O

Hors ligne

#17 Le 07/02/2008, à 10:14

insomniak

Re : récupérer stderr et stdout de wget : impossible ?

Euh, je ne sais pas ce que j'ai foutu mais j'avais du bidouiller un truc qui fallait pas... Donc la ligne que tu donnes dans le post 13 est bonne à  une chose près :

wget -N -nv http://www.monserveur.com/index.php 2>&1 | gawk ' /ERROR/ { printf("%s %s\n", ligneprec, $0) }; {ligneprec=$0}' > err.txt

Par contre, le problème maintenant c'est que je n'ai plus tout ce qui est sortie standard (le log normal quoi).
En gros il faudrait que je fasse une condition qui dit "par contre, s'il n'y a pas le mot ERROR dans toute la sortie, alors inscrire dans out.txt
C'est compliqué tout ça :s


Voilou !
Merci à  tous pour l'aide !
@ bientot

Dernière modification par insomniak (Le 07/02/2008, à 10:21)

Hors ligne