Salut,
Et c'est là que la redirection entre en jeu (tout comme pour "tr) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 wc -l < fich1.xml 6
Salut,
Et c'est là que la redirection entre en jeu (tout comme pour "tr) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 wc -l < fich1.xml 6
$ man woman
Il n'y a pas de page de manuel pour woman.
j'ai essayé avec wc mais ca me retourne l'erreur "too many arguments"
est ce que tu peux m'expliquer que signifie les deux erreurs que j'ai mentionnées. Ca m'aiderai peut être a localiser le probleme.
merci
J'y ai pensé après avoir répondu...
Après j'ai utilisé le sed car j'étais plus dans cet état d'esprit à ce moment là.
Par contre, a priori, après quelque test, le wc -l avec la redirection est plus rapide que le sed. sur un fichier de 25000 ligne environ et de taille 12Mo:
wc: 0,007 secondes
sed: 0,017 secondes
Il vaut mieux donc utiliser "wc" que "sed"
Cordialement.
HéHé!!!, je vous laisse répondre car j'avais aussi la flemme d'expliquer le coup de la redirection
Cordialement.
j'ai essayé avec la commande wc mais j'ai une erreur (too many argument).
est que tu peux m'expliquer les deux erreurs que j'ai mentionnées peut être que j'arriverai à les résoudre si je comprend de quoi il s'agit.
merci
dsl d'avoir posté deux fois j'ai eu un probleme avec mon ordinateur.
SVP aidez mio a faire fonctionner mon script
Je pensais que c'était résolu
Après tous ces échanges, ton script a dû pas mal changer, il serait plus simple que tu nous le montres et que tu nous dises ce qui ne va pas encore dedans.
Cordialement.
voila mon script final:
il ne fonctionne pas: j'ai une erreur de type "too many arguments at line 1"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while [ $(wc -l $1) -lt "1000" ] do echo "on attend 10 secondes" sleep 10 done sed -n -e '1,1000p;1001q' $1 > $2 sed '1,1000d' $1 -i
si je change la première ligne avec [ $(sed -n -e "$=" $1) -lt "1000" ], j'ai une erreur de type "interger expected at line 1)
merci beaucoup pour votre aide
De toute façon, qu'y a-t-il de propre à modifier un fichier en cours de fabrication?Concernant la mise en pause du script, c'est possible en envoyant un signal STOP au processus et ensuite, il suffirait de renvoyer un signal CONT mais ceci n'est pas du tout propre
Question: Est-ce que des méthodes comme celles-ci suffisent pour qu'un processus attende l'autre?
Code : Sélectionner tout - Visualiser dans une fenêtre à part java Ma_classe_java | mon_script.bash
Code : Sélectionner tout - Visualiser dans une fenêtre à part java Ma_classe_java && mon_script2.bash
Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
Alors, il faut rester cohérent coté syntaxe:
pour le cas sed, je n'ai pas écrit:
mais
Code : Sélectionner tout - Visualiser dans une fenêtre à part while [ $(sed -n -e "$=" $1) -lt "1000" ]
Sinon, pour la cas wc, il faut faire une redirection et aussi être cohérent coté syntaxe, donc:
Code : Sélectionner tout - Visualiser dans une fenêtre à part while [ "$(sed -n -e '$=' $1)" -lt "1000" ]
remplacer:
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part while [ $(wc -l $1) -lt "1000" ]
Code : Sélectionner tout - Visualiser dans une fenêtre à part while [ "$(wc -l <$1)" -lt "1000" ]
Cordialement.
Personnellement, je bannis les 2 méthodes, principalement a cause d'un mode de fonctionnement très courant en java qui est de créer un processus fils et de rendre la main en laissant le fils continuer tout seul.
Ou bien ces process java sont destinés à tourner 24/24, donc le script derrière risque d'attendre longtemps pour le 2éme cas et pour le premier cas, en mon sens, il n'y a pas d'attente pour un script qui n'attend pas d'entrée (faudrait que je teste un jour pour voir).
Cordialement.
Merci énormément ça fonctionne très bien je n'ai pas de bug au niveau d'erreur retournée en code java. Il reste juste à voir si ça retourne le résultat demandé mais ça, ça relève du java et non du shell.
Donc voila merci beaucoup je vais laisser le sujet ouvert si jamais je veux apporter des modifications sur le script.
Merci.
bonjour,
J'ai apporté une nouvelle modification sur mon script shell. Je veux qu'il soit exécuté tant que le fichier passé en paramètre n'est pas encore vide.
le problème est que les deux boucles imbriquées (while) ne fonctionnent pas correctement : quand mon fichier devient vide la boucle est toujours exécutée !!
voila le script
quand le fichier $1 devient vide j'ai toujours le message suivant qui s’affiche sans arrêt "on attend 10 secondes pour le fichier $1"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 while [ -s $1 ] do while [ "$(wc -l <$1)" -lt "1000" ] do echo "on attend 10 secondes pour le fichier $1" sleep 10 done echo "fichier $1 prêt, MAJ de $2" sed -n -e '1,1000p;1001q' $1 > $2 sed '1,1000d' $1 -i done
merci pour votre aide!
Bonjour,
Pour ta première boucle, le fichier ne sera jamais vide, puisque la deuxième attend que le fichier possède au moins 1001 ligne (l'option -gt) et que tu ne retires que 1000 lignes, il restera donc automatiquement au moins une ligne dans ton fichier initial.
Donc ici, ce n'est pas le script le problème, c'est une partie de l'algorithme.
Il manque une étape:
Dans quel cas le fichier se retrouve vide ?
Cordialement.
au fait le fichier est remplie par une requête shell SNMP WALK.
lorsque la requête stocke 1000 lignes dans le fichier, des dernière sont transférées vers un autre fichiers. et ainsi de suite jusqu'a ce que la requête soit terminée. donc normalement lorsque SNMP walk s'arrête le fichier se retrouve vidé.
En effet, au lieu de -gt c'est -lt, donc 1000 lignes:
tu es sur que ton shell SNMP WALK se termine sur un multiple de 1000 lignes ?
Sinon, le fichier ne sera jamais totalement vide...
Cordialement.
Au fait j'ai trouvé la source du probleme mais je ne sais pas comment la corriger.
le probleme vient du fait que lorsque je supprime 1000 lignes du fichier d'origine la requête responsable de remplir ce dernier se bloque c'est ce qui fait qu'il n'y a plus aucune ecriture dans le fichier et c'est pourquoi je vais attendre indéfiniment.
j'ai testé à la main plusieurs fois et apparament a chaque fois que j'essaie de modifier un fichier en cours d'écriture, la requête qui le rempli se bloque ( je dis bien se bloque, je n'ai pas un retour de promp)
s'il te plait qu'est ce que je peux faire, si je n'arrive pas à résoudre ceci ca va m'obliger a changer l'algorithme du script
Peux tu essayer de remettre ton fichier à zéro pendant que ton process s'execute et me dire si celui-ci se bloque ?
La méthode pour remettre un fichier à zéro sans en principe modifier l'inode du dit fichier, c'est de faire une simple redirection dessus:
Code : Sélectionner tout - Visualiser dans une fenêtre à part $ >nom_du_fichier
Cordialement.
non ça bloque aussi car c'est équivalent a supprimer la totalité du fichier.
Au fait j'ai pensé a une autre méthode, au lieu de supprimer 1000 lignes et les transférer dans un autres fichier, je pourrais juste les copier sans modifier le fichier de départ. la difficulté est d'imposer la copie de 1000 ligns en se souvenant de l'index de la dernière ligne copiée. j'ai réalisé ce script, mais il ne compile pas correctement
le problème est que quand j'ajoute les 1000 nouvelles lignes dans $1 la boucle while s'exécute toujours, elle ne détecte pas l'ajout
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 sed -n '$=' $1 > size while read line do taille=$line done < size rm size dernier_index=1 while [ "$taille" -lt "$(expr $taille + 1000)" ] # tant que il n'a ya pas ajout de 1000 dernière lignes dans le fichier do echo "attendre que 1000 nouvelles lignes soient rajoutées dans $1" sleep 10 done echo "1000 nouvelles lignes viennent d'être rajoutées dans $1, le fichier $2 est prêt" sed -n -e '$dernier_index,1000p' $1 > $2 dernier_index=$(expr $dernier_index + 1000)
merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager