我想在从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时继续运行。
答案 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 -f
到python -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