【问题标题】:how to parse bash variable for jq如何为jq解析bash变量
【发布时间】:2018-12-27 14:17:14
【问题描述】:

我有一个 test.json 文件,其中包含以下属性。

"solr.baseuri":"http://10.201.17.8:80"

如果我们使用 jq 命令解析确切的变量(solr.baseuri)名称,我们将获得以下脚本的预期输出。

Shell 脚本:

#!/bin/bash

key=`solr.baseuri`

value=`cat test.json |jq '."solr.baseuri"' | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"`

echo "solr value is $value"

输出:

solr value is 10.201.17.8

不确定如何在脚本中使用带有 jq 命令的 $key 来显示值。尝试使用以下不起作用的命令

value=`cat test.json |jq '."${key}"' | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"`

【问题讨论】:

  • 您是否试图摆脱输出中的文字引号?将-r 传递给jq 将发出一个原始值,因此不包含它们。

标签: json bash awk environment-variables jq


【解决方案1】:

我认为您只想将密钥作为--arg 传递:

jq --arg key "solr.baseuri" '.[$key]' file.json

使用可以从示例中的行生成的最小 JSON 对其进行测试:

$ cat file.json 
{ "solr.baseuri":"http://10.201.17.8:80" }
$ jq --arg key "solr.baseuri" '.[$key]' file.json 
"http://10.201.17.8:80"

您可能需要考虑使用jq 内置功能来解析您感兴趣的字符串部分,而不是通过管道传输到grep

要将主机提取到变量中,可以使用capture

$ value=$(jq --arg key solr.baseuri -r '.[$key] | capture(".*://(?<host>[^:]+)") | .host' file.json)
$ echo "$value"
10.201.17.8

这假定属性始终采用scheme://host 的形式,可以选择后跟:port

【讨论】:

    【解决方案2】:

    你可以单独在 jq 中做所有事情。您甚至可以比以下方法做得更好:

    #!/usr/bin/env bash
    
    key="solr.baseuri"
    jq --arg key "$key" '
      .[$key] | split("/") | .[2] | split(":") | .[0]' test.json
    

    这使用 shell 变量 $key 作为 jq 的参数。 Jq 然后拆分生成的 URL,首先在正斜杠上,然后在冒号上。结果应该是主机名(或者对于您的示例数据,IP 地址)。

    请注意,在您的初始脚本中,您遇到了引用问题——您的变量分配使用了反引号,这是一种处理命令替换的过时机制。双引号或单引号用于字符串。你现在可能已经知道了。 ;-)

    【讨论】:

      【解决方案3】:

      您的脚本有多个问题。快速而肮脏的答案是“使用双引号”,但此外,您需要修复可怕的语法错误。

      #!/bin/bash
      # single quotes '...' not backticks `...`
      key='solr.baseuri'
      # avoid useless cat
      # prefer modern $(...) syntax over paleolithic `...`
      # use double quotes around variable
      value=$(jq ".\"$key\"" test.json | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b")
      
      echo "solr value is $value"
      

      不难避免grep(甚至可能还有echo)并使用jq 从URL 中提取IP 地址。 (无论如何,\b 在大多数 grep 版本中都无效。)

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2012-04-28
      • 2021-03-04
      相关资源
      最近更新 更多