3

我有一个带有 url 的列表,我喜欢用 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;
4

1 回答 1

2

在发出每个 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
于 2013-11-15T17:43:07.810 回答