xargsが複数のプロセスからの出力をうまくマージしないようにする方法は?


17

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

ただし、プロセスの出力は、stdout適切な行分離を考慮せずにストリームにマージされます。だから私はしばしば次のような行になります:

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

パターン全体で出力全体を使用egrep^ているので、xargsこれは結果を台無しにします。

xargsプロセス出力を順番に(1つのプロセスの出力が連続している限り、任意の順序で)強制的に書き込む方法はありますか?

または他の解決策はありますか?

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

さまざまなホストから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を使用します。


あなたの質問のより完全な例ができますか?現在どのように、またはなぜ使用しているのかは明確ではありませんxargs
カレブ

これに対する解決策は難しく、各プロセスの標準出力に異なるファイル記述子を使用し、小さなサーバーを使用して行を収集する必要があります。xargsそのような機能を提供していないようです。
ステファンギメネス

@カレブそこに行く、これが役立つことを願って:
クリストフワーム

確かに軽量なソリューションではありませんが、多分あなたはmakeのジョブ機能を使用できmakeます。出力行を適切にマージすると思います。
ステファンギメネス

--line-bufferedフラグを追加するのにegrep役立ちます
-iruvar

回答:


6

これでうまくいくはずです:

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

ここでの考え方は、別々のカウントを作成し、それらを最後に合計することです。個別のカウントが混合するのに十分な大きさであれば失敗する可能性がありますが、そうではないはずです。


14

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
素敵なツール!また、誰かが猫がすぐに役に立たないことをあなたに言うと信じています。
ステファンギメネス

1
知っている。しかし、読みやすく、通常48コアのマシンで作業しているので、アイドルコアの1つに対するいくつかの余分なクロックサイクルはまだ問題になりません。
オレ丹下

Debianリポジトリにある場合、parallelは仕事に最適です。
クリストフワーム

1
@Legate Debianは含まれてparallelからコマンドをmoreutilsここに十分である、:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs
ジル「SO-停止されて悪」

@Legateチェックアウトbuild.opensuse.org/package/... .debファイルとのためbugs.debian.org/cgi-bin/bugreport.cgi?bug=518696プッシュするバグのため。
オレ丹下
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.