Saya menggunakan xargs
dengan opsi --max-args=0
(alternatif -P 0
).
Namun, output dari proses digabung ke dalam stdout
aliran tanpa memperhatikan pemisahan garis yang tepat. Jadi saya akan sering berakhir dengan garis-garis seperti:
<start-of-line-1><line-2><end-of-line-1>
Seperti yang saya gunakan egrep
dengan ^
dalam pola saya pada seluruh xargs
output ini mengacaukan hasil saya.
Apakah ada cara untuk memaksa xargs
untuk menulis output proses dalam urutan (urutan apa pun, selama output dari satu proses bersebelahan)?
Atau solusi lain?
Edit: detail lebih lanjut tentang use case:
Saya ingin mengunduh dan mem-parsing halaman web dari host yang berbeda. Karena setiap halaman membutuhkan waktu sekitar satu detik untuk memuat dan ada beberapa lusin halaman saya ingin memparalelkan permintaan.
Perintah saya memiliki bentuk berikut:
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'
Saya menggunakan bash dan bukan sesuatu seperti Perl karena IP host (variabel $ IP) dan beberapa data lainnya berasal dari file bash yang disertakan.
sumber
xargs
.xargs
sepertinya tidak menyediakan fitur seperti itu.make
fitur pekerjaan, saya pikirmake
menggabungkan jalur output dengan benar.--line-buffered
bendera untukegrep
membantuJawaban:
Ini harus melakukan trik:
Idenya di sini adalah untuk membuat penghitungan yang terpisah dan menjumlahkan ini pada akhirnya. Mungkin gagal jika jumlah yang terpisah cukup besar untuk dicampur, tetapi seharusnya tidak demikian.
sumber
GNU Parallel dirancang khusus untuk mengatasi masalah ini:
Jika IP Anda ada dalam file itu bahkan lebih cantik:
Untuk mempelajari lebih lanjut tonton video intro: http://www.youtube.com/watch?v=OpaiGYxkSuQ
sumber
parallel
perintah dari moreutils , yang cukup di sini:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs