来自stdin的wget或curl

时间:2012-01-21 23:47:37

标签: unix curl wget stdin xargs

我想在从stdin提供网址时下载网页。基本上一个进程连续生成stdout / file的URL,我想将它们管道输出到wget或curl。 (如果您愿意,可以将其视为简单的网络爬虫)。

这似乎工作正常:

tail 1.log | wget -i - -O - -q 

但是当我使用' tail -f'并且它不再起作用了(缓冲或wget正在等待EOF?):

tail -f 1.log | wget -i - -O - -q

有人可以使用wget,curl或任何其他标准Unix工具提供解决方案吗?理想情况下,我并不想在循环中重新启动wget,只是让它在下载URL时继续运行。

5 个答案:

答案 0 :(得分:7)

您需要使用的是xargs。 E.g。

tail -f 1.log | xargs -n1 wget -O - -q

答案 1 :(得分:5)

您可以使用cURL执行此操作,但您的输入需要正确格式化。 示例alfa.txt:

url example.com
output example.htm
url stackoverflow.com
output stackoverflow.htm

替代示例:

url stackoverflow.com/questions
remote-name
url stackoverflow.com/documentation
remote-name

示例命令:

cat alfa.txt | curl -K-

答案 2 :(得分:0)

使用xargs将stdin转换为参数。

tail 1.log | xargs -L 1 wget

答案 3 :(得分:0)

尝试管道tail -fpython -c $'import pycurl;c=pycurl.Curl()\nwhile True: c.setopt(pycurl.URL,raw_input().strip()),c.perform()'

这会卷曲(好吧,你可能意味着命令行卷曲,我把它称为来自Python单行程序的库,但它仍然卷曲)立即获取每个URL,如果您按顺序从同一服务器请求多个URL,仍然可以保持套接字保持打开状态。但它并不完全健壮:如果您的某个网址是duff,整个命令将失败(您可能希望将其设为正确的Python脚本并添加try / except来处理此问题),还有它会在EOF上抛出EOFError的小细节(但我假设如果您使用tail -f并不重要)。

答案 4 :(得分:0)

如果在同一Web服务器上下载文件,则有效的方法是避免使用xargs。

wget -q -N -i - << EOF
http://sitename/dir1/file1
http://sitename/dir2/file2
http://sitename/dir3/file3
EOF