【问题标题】:How to store curl output in multiple variables in Bash如何在 Bash 中将 curl 输出存储在多个变量中
【发布时间】:2020-07-04 01:56:43
【问题描述】:

在我的脚本中,我有两个 http 请求。我想重用连接,所以例如我所做的是:

curl -v 'http://example.com?id=1&key1=value1' 'http://example.com?id=1&key2=value2'

有没有办法将每个 http 请求的输出存储在两个不同的变量中?我一直在寻找。我还没有找到任何解决方案。

我知道我可以执行以下操作将输出存储在两个不同的文件中。

curl -v 'http://example.com?id=1&key1=value1' -o output1 'http://example.com?id=1&key2=value2' -o output2

编辑:这是我的用例

我有一个 cronjob,每隔几分钟运行一次并行(GNU 并行)命令。而“get_data.sh”将运行 2000 次,因为 input.csv 中有 2000 行。我想避免使用 tmp 文件来获得最佳性能。

parallel \
  -a input.csv \
  --jobs 0 \
  --timeout $parallel_timeout \
  "get_data.sh {}"

在 get_data.sh 中:

id=$1
curl -v "http://example.com?id=${id}&key1=value1" -o output1 \
"http://example.com?id=${id}&key2=value2" -o output2

stat1=$(cat output1 | sed '' | cut ..)
stat2=$(cat output2 | awk '')

【问题讨论】:

  • 接下来你打算对变量做什么?
  • 使用sed、awk、cut等命令获取我关心的数据
  • 你有多少个shell变量?
  • 脚本'get_data.sh'实际上会并行运行2000次。我编辑了我的问题。我希望能更好地解释我的用例。如果您需要更多信息,请告诉我:)
  • 在我看来,您的文件每行可能运行 8 个或更多进程(bashcurlawksedcat 等),收入超过 16,000过程。我不禁认为您最好使用 Python 和多线程。如果做不到这一点,请将您的临时文件写入/tmp,这是一个基于 RAM 的文件系统,应该更快。

标签: bash curl


【解决方案1】:

好的,这里有一些灵感:

id=$1
output1=$(curl -v "http://example.com?id=${id}&key1=value1")
output2=$(curl -v "http://example.com?id=${id}&key2=value2")

stat1=$(echo "$output1" | sed '' | cut ..)
stat2=$(echo "$output2" | awk '')

这样可以避免将内容写入磁盘。

【讨论】:

    【解决方案2】:

    您正在寻找parset。它是 env_parallel 的一部分,它是 GNU Parallel 包 (https://www.gnu.org/software/parallel/parset.html) 的一部分:

    parset myarr \
      -a input.csv \
      --jobs 0 \
      --timeout $parallel_timeout \
      get_data.sh {}
    
    echo "${myarr[3]}"
    

    您可以让parset 运行所有组合 - 就像使用 GNU Parallel 一样:

    echo www.google.com > input.txt
    echo www.bing.com >> input.txt
    
    # Search for both foo and bar on all sites
    parset output curl https://{1}/?search={2} :::: input.txt ::: foo bar
    
    echo "${output[1]}"
    echo "${output[2]}"
    

    如果您对 foobar 进行不同的处理,您可以创建函数并运行它们:

    # make all new functions, arrays, variables, and aliases defined after this
    # available to env_parset
    env_parallel --session
    
    foofunc() {
      id="$1"
      curl -v "http://example.com?id=${id}&key1=value1" | sed '' | cut -f10
    }
    
    barfunc() {
      id="$1"
      curl -v "http://example.com?id=${id}&key2=value2" | awk '{print}'
    }
    
    # Run both foofunc and barfunc on all sites
    env_parset output {1} {2} ::: foofunc barfunc :::: input.txt
    
    echo "${output[1]}"
    echo "${output[2]}"
    env_parallel --end-session
    

    如果您不想export -f 在函数中使用的函数和变量,则需要--(end-)sessionenv_parset

    GNU Parallel 使用临时文件。如果您的命令运行得很快,那么这些临时文件在被删除之前永远不会接触到磁盘。相反,它们保留在 RAM 中的磁盘缓存中。您甚至可以通过将 --tmpdir 指向 ramdisk 来强制它们留在 RAM 中:

    mkdir /dev/shm/mydir
    parset output --tmpdir /dev/shm/mydir ...
    

    【讨论】:

    • 是的,这对我很有帮助。我可以将 get_data.sh 的输出存储到一个数组中。你能解释一下 parset 是否适用于curl -v 'http://example.com?id=1&key1=value1' -o output1 'http://example.com?id=1&key2=value2' -o output2 而不是两个 tmp 文件 output1 和 output2,我可以将结果保存在两个变量中还是一个数组中?
    猜你喜欢
    • 2021-07-04
    • 2014-10-21
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多