我有一个带有url的列表,我喜欢用CURL加载,并使用bash脚本对结果执行一些操作。 由于它几乎是100k的请求,我喜欢并行运行它。 我已经研究过GNU parallel,但是我怎么把它们粘在一起呢?谢谢!
bashscript:
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;
答案 0 :(得分:2)
在发出每个HTTP请求时,不应修改URL的输入列表。并且让多个appender从不同进程写入相同的输出文件可能会以泪流满面。
将大多数命令放在一个单独的脚本(名为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