Estoy usando xargscon la opción --max-args=0(alternativamente -P 0).
Sin embargo, la salida de los procesos se fusiona en la stdoutsecuencia 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 egrepcon ^mi patrón en toda la xargsproducción este es echar a perder mi resultado.
¿Hay alguna forma de obligar xargsa 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.xargsno parece proporcionar tal característica.makela función de trabajos, creo quemakecombina las líneas de salida correctamente.--line-bufferedbandera paraegrepayudarRespuestas:
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
parallelcomando de moreutils , que es suficiente aquí:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs