【问题标题】:append output of multiple curl requests to a file from shell script将多个 curl 请求的输出附加到 shell 脚本中的文件
【发布时间】:2015-03-23 20:19:20
【问题描述】:

我正在尝试通过内部 API 获取 JSON 输出并将 100 添加到 cURL 请求之间的参数值。我需要循环,因为它将每个请求的最大结果数限制为 100。我被告知“增加,你应该能够得到你需要的”。

不管怎样,这是我写的:

#!/bin/bash

COUNTER=100
until [ COUNTER -gt 30000 ]; do
    curl -vs "http://example.com/locations/city?limit=100&offset=$COUNTER" >> cities.json
    let COUNTER=COUNTER+100
done

问题是我在终端中收到了一堆奇怪的消息,而我试图重定向输出的文件仍然包含它原来的 100 个对象。我觉得我可能错过了一些非常明显的东西。有什么想法吗?我确实在 until 循环上使用了一个有点旧的教程,所以也许这是一个语法问题?

提前谢谢你!

编辑:我不反对完全替代的方法,但我希望这会有点简单。我认为我缺乏经验是主要的限制因素。

【问题讨论】:

  • 为什么它包含它的原始内容?你只是在追加。
  • 关于“发送到终端的奇怪消息”——curl 的 stderr 的所有内容都将打印到终端,因为您使用的是curl -v,这就是您的行为要求。如果您希望 curl 打印不同的消息,我建议您确定您真正想要的详细程度。
  • @CharlesDuffy 我认为我最初的评论有点不准确。我的意思是当我停止该过程时没有附加任何内容 - 内容仍然是我第一次使用 cURL 时文件中的原始 100 个对象。几分钟后我停止了脚本,因为请求被挂起。我对我使用的选项也有错误(我认为 -s 应该抑制一些标准输出和标准错误),因此可以解释终端中的消息。我没有接受过正规培训,所以这对我来说有点新鲜。

标签: bash shell curl


【解决方案1】:

您可能会发现使用 GNU Parallel 可以更快、更轻松地做到这一点:

parallel -k curl -vs "http://example.com/locations/city?limit=100\&offset={}" ::: $(seq 100 100 30000) > cities.json

【讨论】:

  • 直到现在我还没有使用并行的经验 - 谢谢!根据您的经验,这对循环是否更有效?另外,使用并行而不是 shell 脚本有什么缺点吗?
  • GNU Parallel 在您有很多事情要并行执行时非常有用,例如从 60,000 张图像中剥离元数据,或者当您有很多需要高延迟的事情要做时 - 例如 curl 或 @ 987654323@ 在这里您可以隐藏 7 个事物的延迟在第 8 个事物的延迟之后并获得更好的性能,因为所有这些延迟都是并行发生的。对于本质上是顺序的事情,它也好不到哪里去。虽然它是您工具箱的宝贵工具,但可以很快尝试解决许多问题 - 所以吸吮它并看看
  • 您可能会发现可以在-k 之后添加-j 16 以并行运行16 个卷曲...
【解决方案2】:

如果您只想在整个循环中覆盖文件内容一次...

#!/bin/bash
# ^-- NOT /bin/sh, as this uses bash-only syntax

for (( counter=100; counter<=30000; counter+=100 )); do
    curl -vs "http://example.com/locations/city?limit=100&offset=$counter"
done >cities.json

这实际上比在每个curl 命令上添加&gt;&gt;cities.json 更有效,因为它只打开输出文件一次,并且具有在循环时清除文件以前内容的副作用(您似乎想要)已启动。

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2015-07-14
    相关资源
    最近更新 更多