Estoy usando xargs
con la opción --max-args=0
(alternativamente -P 0
).
Sin embargo, la salida de los procesos se fusiona en la stdout
secuencia sin tener en cuenta la separación de línea adecuada. Así que a menudo terminaré con líneas como:
<start-of-line-1><line-2><end-of-line-1>
Como estoy usando egrep
con ^
mi patrón en toda la xargs
producción este es echar a perder mi resultado.
¿Hay alguna forma de obligar xargs
a escribir las salidas del proceso en orden (cualquier orden, siempre que la salida de un proceso sea contigua)?
¿O alguna otra solución?
Editar: más detalles sobre el caso de uso:
Quiero descargar y analizar páginas web de diferentes hosts. Como cada página tarda aproximadamente un segundo en cargarse y hay unas pocas docenas de páginas, quiero paralelizar las solicitudes.
Mi comando tiene la siguiente forma:
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'
Uso bash y no algo como Perl porque las IP del host (la variable $ IPs) y algunos otros datos provienen de un archivo bash incluido.
fuente
xargs
.xargs
no parece proporcionar tal característica.make
la función de trabajos, creo quemake
combina las líneas de salida correctamente.--line-buffered
bandera paraegrep
ayudarRespuestas:
Esto debería funcionar:
La idea aquí es hacer recuentos separados y sumarlos al final. Podría fallar si los recuentos por separado son lo suficientemente grandes como para ser mezclados, pero no debería ser el caso.
fuente
GNU Parallel está específicamente diseñado para resolver este problema:
Si sus IP están en un archivo, es aún más bonito:
Para obtener más información, vea el video de introducción: http://www.youtube.com/watch?v=OpaiGYxkSuQ
fuente
parallel
comando de moreutils , que es suficiente aquí:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs