Bashscript 与 curl 操作并行



我有一个包含网址的列表,我喜欢用 CURL 加载它,并使用 bash 脚本对结果进行一些操作。由于它几乎是 100k 个请求,我喜欢并行运行它。我已经研究了 GNU 并行,但是我将如何粘合在一起?谢谢!

抨击:

while read URL; do
curl -L -H "Accept: application/unixref+xml" $URL > temp.xml;
YEAR=$(xmllint --xpath '//year' temp.xml);
MONTH=$(xmllint --xpath '(//date/month)[1]' temp.xml);
echo "$URL;$YEAR;$MONTH" >> results.csv;
sed -i '1d' urls.txt;
done < urls.txt;

您不应该在发出每个 HTTP 请求时修改 URL 的输入列表。 让多个追加器从不同的进程写入同一个输出文件可能会以眼泪告终。

将大多数命令放在一个单独的脚本(例如命名为 geturl.sh)中,该脚本可以使用 URL 作为参数调用,并将其输出行写入标准输出:

#!/usr/bin/env bash
URL="${1}"
curl -L -H "Accept: application/unixref+xml" "${URL}" > /tmp/$$.xml
YEAR="$(xmllint --xpath '//year' /tmp/.xml)"
MONTH="$(xmllint --xpath '(//date/month)[1]' /tmp/$$.xml)"
rm -f /tmp/$$.xml
echo "${URL};${YEAR};${MONTH}"

然后按如下方式调用(这里我们让parallel逐行合并各个线程的输出):

parallel --line-buffer geturl.sh < urls.txt > results.csv

最新更新