J'utilise xargs
avec l'option --max-args=0
(alternativement -P 0
).
Cependant, la sortie des processus est fusionnée dans le stdout
flux sans tenir compte de la séparation de ligne appropriée. Je vais donc souvent me retrouver avec des lignes telles que:
<start-of-line-1><line-2><end-of-line-1>
Comme j'utilise egrep
avec ^
dans mon modèle sur la xargs
sortie entière, cela gâche mon résultat.
Existe-t-il un moyen de forcer l' xargs
écriture des sorties de processus dans l'ordre (n'importe quel ordre, tant que la sortie d'un processus est contiguë)?
Ou une autre solution?
Modifier: plus de détails sur le cas d'utilisation:
Je souhaite télécharger et analyser des pages Web à partir de différents hôtes. Comme chaque page prend environ une seconde à charger et qu'il y a quelques dizaines de pages, je veux paralléliser les demandes.
Ma commande a la forme suivante:
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'
J'utilise bash et pas quelque chose comme Perl car les adresses IP hôtes (la variable $ IPs) et certaines autres données proviennent d'un fichier bash inclus.
la source
xargs
.xargs
ne semble pas offrir une telle fonctionnalité.make
la fonction de travail de, je pense quemake
les lignes de sortie sont correctement fusionnées.--line-buffered
drapeau pouregrep
aiderRéponses:
Cela devrait faire l'affaire:
L'idée ici est de faire des comptes séparés et de les additionner à la fin. Peut échouer si les nombres séparés sont suffisamment importants pour être mélangés, mais cela ne devrait pas être le cas.
la source
GNU Parallel est spécialement conçu pour résoudre ce problème:
Si vos IP sont dans un fichier, c'est encore plus joli:
Pour en savoir plus, regardez la vidéo d'introduction: http://www.youtube.com/watch?v=OpaiGYxkSuQ
la source
parallel
commande de moreutils , ce qui est suffisant ici:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs