Process
如何阻止 xargs 嚴重合併來自多個程序的輸出?
我正在使用
xargs
選項--max-args=0
(或者-P 0
)。但是,程序的輸出被合併到
stdout
流中,而不考慮適當的行分隔。所以我經常會得到如下幾行:<start-of-line-1><line-2><end-of-line-1>
當我在整個輸出的模式中使用
egrep
with時,這弄亂了我的結果。^``xargs
有沒有辦法強制
xargs
按順序編寫程序輸出(任何順序,只要一個程序的輸出是連續的)?還是其他解決方案?
**編輯:**有關案例的更多詳細資訊:
我想從不同的主機下載和解析網頁。由於每個頁面需要大約一秒鐘的時間來載入,並且有幾十個頁面我想並行化請求。
我的命令具有以下形式:
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \ wget -q -O- http://{}/somepage.html | egrep --count '^string'
我使用 bash 而不是 Perl 之類的東西,因為主機 IP($IPs 變數)和其他一些數據來自包含的 bash 文件。
這應該可以解決問題:
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; }
這裡的想法是分別計算並在最後求和。如果單獨的計數大到足以混合,則可能會失敗,但事實並非如此。
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