Como impedir que os xargs se unam mal aos resultados de vários processos?

17

Estou usando xargs com a opção --max-args=0 (alternativamente -P 0 ).

No entanto, a saída dos processos é mesclada no fluxo stdout sem considerar a separação de linha adequada. Então, muitas vezes acabo com linhas como:

<start-of-line-1><line-2><end-of-line-1>

Como eu estou usando egrep com ^ no meu padrão em todo o xargs output, isso está atrapalhando o meu resultado.

Existe alguma maneira de forçar o xargs a escrever as saídas do processo em ordem (qualquer ordem, contanto que a saída de um processo seja contígua)?

Ou alguma outra solução?

Editar: mais detalhes sobre o caso de uso:

Eu quero baixar e analisar páginas da web de hosts diferentes. Como cada página leva cerca de um segundo para carregar e há algumas dezenas de páginas que eu quero paralelizar as solicitações.

Meu comando tem o seguinte formato:

echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'

Eu uso o bash e não algo parecido com o Perl porque os IPs do host (a variável $ IPs) e alguns outros dados vêm de um arquivo bash incluído.

    
por Christoph Wurm 30.07.2011 / 17:10

2 respostas

6

Isso deve funcionar:

echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
  sh -c "wget -q -O- 'http://{}/somepage.html' | egrep --count '^string'" | \
  { NUM=0; while read i; do NUM=$(($NUM + $i)); done; echo $NUM; }

A ideia aqui é fazer contagens separadas e somar essas no final. Pode falhar se as contagens separadas forem grandes o suficiente para serem misturadas, mas não deve ser o caso.

    
por 30.07.2011 / 18:36
13

O GNU Parallel é especificamente projetado para resolver este problema:

echo -n $IPs | parallel -d ' ' -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'

Se os seus IPs estão em um arquivo, é ainda mais bonito:

cat IPs | parallel -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'

Para saber mais, assista ao vídeo de introdução: link

    
por 30.07.2011 / 20:46