![使用 xargs 的多個參數。](https://rvso.com/image/36041/%E4%BD%BF%E7%94%A8%20xargs%20%E7%9A%84%E5%A4%9A%E5%80%8B%E5%8F%83%E6%95%B8%E3%80%82.png)
我知道 xargs 可以像這樣接受很多參數。
xargs -n5 -I{} echo {}
但我如何將參數放在我想做的特定位置。
xargs -n5 -I{} curl www.google.com/{1}/testing/{2}/{3}/works/{5}
怎樣才能實現這樣的目標呢?
答案1
我認為你不能直接使用 來做到這一點xargs
。要么按照科斯塔斯的建議使用read
,要么執行以下操作:
xargs -n5 sh -c 'curl "http://www.google.com/${1}/testing/${2}/${3}/works/${5}"' curl-command
或建立 URL,然後將其傳遞給xargs
:
awk '{printf "http://www.google.com/%s/testing/%s/%s/works/%s\n", $1, $2, $3, $5}' | \
xargs -L1 curl
答案2
您幾乎會認為您發明了 GNU Parallel 的語法:
... | parallel -N5 curl www.google.com/{1}/testing/{2}/{3}/works/{5}
您將獲得額外的好處,即curl
每個 CPU 都運行一個。
GNU Parallel 是一個通用並行器,可以輕鬆地在同一台電腦或多台您可以透過 ssh 存取的電腦上並行運行作業。
如果您想要在 4 個 CPU 上執行 32 個不同的作業,則並行化的直接方法是在每個 CPU 上執行 8 個作業:
相反,GNU Parallel 在完成後會產生一個新進程 - 保持 CPU 處於活動狀態,從而節省時間:
安裝
如果您的發行版未打包 GNU Parallel,您可以進行個人安裝,不需要 root 存取權。這樣做可以在 10 秒內完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
其他安裝選項,請參閱http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解更多
查看更多範例:http://www.gnu.org/software/parallel/man.html
觀看介紹影片:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
瀏覽本教學:http://www.gnu.org/software/parallel/parallel_tutorial.html
註冊電子郵件清單以獲得支援:https://lists.gnu.org/mailman/listinfo/parallel
答案3
system()
的函數awk
可用於此目的。
$ awk '{system("curl -v www.google.com/"$1"/testing/"$2"/"$3"/works/"$4)}' file.txt
這裡file.txt
包含命令的參數curl
。