Curl
如何將多行與 xargs 結合起來
我有一個包含 30M 行的大輸入文件,新行在
\r\n
. 我想通過向帶有curl
.我嘗試了以下方法:
< input.xt tr -d '\r' | xargs -P 8 -r -d '\n' -n 1000 -I {} curl -s -X POST --data-binary '{}' http://...
請注意,我首先從輸入中刪除
\r
’s ,因為似乎無法拆分多個字元。tr``xargs
然而,上面的命令似乎仍然為程序提供了一行
curl
,儘管是curl
並行的 8 個程序(因為-P 8
參數)。如何修復此命令,以便將 1000 行的塊傳遞給
curl
,同時保持並行性?我知道這些行將以隨機順序到達 REST 服務,這對我的案例來說很好。
GNU Parallel 就是為此而建構的:
< input.xt parallel -P 8 -d '\r\n' -n 1000 curl -s -X POST --data-binary '{}' http://...
如果要保留 \r\n,請使用
--pipe
. 這預設傳遞 ~1 MB 的塊:< input.xt parallel -P 8 --pipe curl -s -X POST --data-binary @- http://...
-I {}
並且-n
不兼容。-n n
告訴xargs
將n
參數傳遞給命令並-I {}
獲取一個參數,並且每次出現的{}
都被它替換。如果我理解正確,您希望每次呼叫
curl
都有一個由 1000 行組成的參數傳遞給它的--data-binary
. 所以也許:<input.txt awk '{print}; NR % 1000 == 0 {printf "\0"}' | xargs -r0 -P8 -I {} curl -s -X POST --data-binary {} http://...
這會在每 1000 行(包括它們的 CRLF 分隔符)之後插入一個 NUL,並
xargs -r0
在這些行上拆分。我懷疑網站的維護者會感謝你發送這麼多請求。另請注意,並行
curl
s 的輸出最終可能會嚴重交錯。另請注意,在 Linux 上,單個參數的大小不能大於 128KiB。