xargsが複数のプロセスの出力を誤ってマージするのを防ぐ方法は?

xargsが複数のプロセスの出力を誤ってマージするのを防ぐ方法は?

私はxargs対応するオプション--max-args=0(または-P 0)を使用しています。

しかし、プロセスの出力は、stdout適切なライン分離を考慮せずにストリームにマージされます。だから私はしばしば次のような言葉を聞きます。

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

全体の出力パターンにwithを使用すると、egrep結果が混乱します。^xargs

xargsプロセス出力を順番に(あるプロセスの出力が連続的であればどのような順序でも)強制的に記録する方法はありますか?

それとも別のソリューション?

編集する:ユースケースの詳細:

他のホストからWebページをダウンロードして解析したいです。各ページの読み込みには約1秒かかり、数十ページありますので、リクエストを並列化したいと思います。

私のコマンドの形式は次のとおりです。

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

ホストIP($ IPs変数)と他のいくつかのデータを含むbashファイルから来るので、Perlのようなものではなくbashを使用しています。

答え1

GNU Parallelはこの問題を解決するために特別に設計されています。

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

IPがファイルにあると、もっと美しいです。

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

詳しくは、紹介動画をご覧ください。http://www.youtube.com/watch?v=OpaiGYxkSuQ

答え2

これにより、トリックを実行できます。

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; }

ここでのアイデアは、別々の計算を作成して最後に合計することです。個々の数が混在するのに十分な大きさの場合、この操作は失敗する可能性がありますが、そうではありません。

関連情報