Process

如何阻止 xargs 嚴重合併來自多個程序的輸出?

  • June 21, 2016

我正在使用xargs選項--max-args=0(或者-P 0)。

但是,程序的輸出被合併到stdout流中,而不考慮適當的行分隔。所以我經常會得到如下幾行:

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

當我在整個輸出的模式中使用egrepwith時,這弄亂了我的結果。^``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

引用自:https://unix.stackexchange.com/questions/17673