Bash cURL调用中的正则表达式

Bash cURL调用中的正则表达式,bash,curl,Bash,Curl,我有一个类似这样的卷发呼叫: curl --silent --max-filesize 500 --write-out "%{http_code}\t%{url_effective}\n" 'http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.[200-210].dmg' -o /dev/null 404 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.203.dmg 404 h

我有一个类似这样的卷发呼叫:

curl --silent --max-filesize 500 --write-out "%{http_code}\t%{url_effective}\n" 'http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.[200-210].dmg' -o /dev/null
404 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.203.dmg
404 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.204.dmg
200 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.205.dmg
404 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.206.dmg
此调用生成一个URL列表,其中包含HTTP代码(通常为200或404),如下所示:

curl --silent --max-filesize 500 --write-out "%{http_code}\t%{url_effective}\n" 'http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.[200-210].dmg' -o /dev/null
404 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.203.dmg
404 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.204.dmg
200 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.205.dmg
404 http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.206.dmg
唯一有效的URL是前面有200个HTTP代码的URL,因此我想在cURL中放一个正则表达式,以便它只下载以200开头的行

有没有关于如何在不使用bash脚本的情况下实现这一点的想法


提前感谢您

您可以使用以下功能:

curl --silent -f --max-filesize 500 --write-out "%{http_code}\t%{url_effective}\n" -o '#1.dmg' 'http://fmdl.filemaker.com/maint/107-85rel/fmpa_17.0.2.[200-210].dmg' 
这将尝试访问每个url,当它不是404或太大时,将其下载到一个文件中,该文件的名称将基于url中的索引

-f
标志可以避免在HTTP代码不成功时输出响应内容,而
-o
标志指定一个输出文件,其中
#1
对应于
[200-210]
范围的有效值(添加其他
[]
{}
将允许您通过其索引引用URL的其他部分)


请注意,在我的测试过程中,
--max filesize 500
标志阻止下载唯一一个没有以404、
fmpa_17.0.2.205.dmg结尾的url

避免使用bash脚本的原因是什么?单个管道可以吗,或者您真的需要使用单个
curl
命令吗?Aaron,谢谢您的回答…单个管道非常好,因为我可以直接从命令行执行它。我无法测试它,但使用
-f
应该足以避免404上的输出,因此,添加该标志并删除
-o/dev/null
实际上就足够了。(编辑:不,这不会,所有200个URL都将输出到标准输出而不是它们自己的文件中)f标志非常适合不下载每个404响应为false.dmg,但是带有#1的-o给了我一个名为205.dmg的文件,而不是URL中指定的名称,所以我将其更改为-o标志,现在我得到了“fmpa#u 17.0.2.205.dmg”正如我所需要的。--max filesize 500只是为了试验,所以我不会每次都下载整个包。我刚把它删除了。我唯一得不到的是--输出“%{http\u code}\t%{url\u effective}\n”只显示200个响应,而不是全部响应,即使它们之后没有下载。@Bottaco您应该能够通过在curl调用后添加一个
|grep-E'^2'
来过滤2xx响应。非常感谢Aaron,我已经尝试过grep选项,但是我想马上看到输出,并且通过grep重定向,我只在完成时看到条目。但这对我们所需要的是好的。非常感谢您的帮助和帮助knowledge@Bottacco我认为这个问题可以通过在curl命令中添加
-N
标志来解决(
--no buffer;Disable buffering of the output stream
)。否则可能会解决这个问题。我已经尝试了
-N
标志,这没有什么区别……我将在另一个问题中尝试解决方案,但由于我在macOS上使用bash,我认为
unbuffer
命令不存在,或者至少没有人进入。