Curl

如何將多行與 xargs 結合起來

  • July 22, 2021

我有一個包含 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告訴xargsn參數傳遞給命令並-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在這些行上拆分。

我懷疑網站的維護者會感謝你發送這麼多請求。另請注意,並行curls 的輸出最終可能會嚴重交錯。

另請注意,在 Linux 上,單個參數的大小不能大於 128KiB。

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