Linux 从shell中的json中提取特定元素的值

Linux 从shell中的json中提取特定元素的值,linux,shell,parsing,scripting,Linux,Shell,Parsing,Scripting,我有一个如下的字符串(基本上是HTTP请求的响应) 现在我有了一个shell脚本,在这里我捕获这个http响应并对其进行解析,以提取变量'enabled'的值。我已经编写了这段代码,但它似乎确实在工作。我对壳牌公司非常陌生,所以不确定我是否做了一些完全错误的事情,或者遗漏了任何具体细节 enabled=$(echo $response | awk -F"," '/content/ { for( i=1; i < NF; i++) { if( match( $i, /e

我有一个如下的字符串(基本上是HTTP请求的响应)

现在我有了一个shell脚本,在这里我捕获这个http响应并对其进行解析,以提取变量'enabled'的值。我已经编写了这段代码,但它似乎确实在工作。我对壳牌公司非常陌生,所以不确定我是否做了一些完全错误的事情,或者遗漏了任何具体细节

enabled=$(echo $response | awk -F"," '/content/ {
    for( i=1; i < NF; i++) {
       if( match( $i, /enabled/) ){
           split( $i, a, ":")
           print a[length(a)]
       }
    }
  }')
enabled=$(echo$response | awk-F“,””/content/{
对于(i=1;i
是否有人可以建议最好的方法或者任何其他建议来捕获标记“enabled”的值以响应http请求。已启用的标记将始终显示在标记“内容”下

注: 我做了研究并尝试理解shell脚本。这就是我编写上述代码的方式。但有些地方似乎不正确,因此我从未启用标记的值


欢迎提供任何指导或建议,其中
response={…}
是您的完整JSON字符串:

$ echo 'response={...}' | perl -MJSON::PP -wne 's/^[^{]+//; print decode_json($_)->{content}->{enabled};'  
1
如果您有如您所说的Perl 5.18.2,那么使用它应该不会有问题:

$ corelist -a JSON::PP

Data for 2015-12-21
JSON::PP was first released with perl v5.13.9
  v5.13.9    2.27103
  v5.13.10   2.27103
  v5.13.11   2.27105
  v5.14.0    2.27105
  ...
  v5.18.0    2.27202
  v5.18.1    2.27202
  v5.18.2    2.27202
  v5.18.3    2.27202

其中
response={…}
是完整的JSON字符串:

$ echo 'response={...}' | perl -MJSON::PP -wne 's/^[^{]+//; print decode_json($_)->{content}->{enabled};'  
1
如果您有如您所说的Perl 5.18.2,那么使用它应该不会有问题:

$ corelist -a JSON::PP

Data for 2015-12-21
JSON::PP was first released with perl v5.13.9
  v5.13.9    2.27103
  v5.13.10   2.27103
  v5.13.11   2.27105
  v5.14.0    2.27105
  ...
  v5.18.0    2.27202
  v5.18.1    2.27202
  v5.18.2    2.27202
  v5.18.3    2.27202
通过使用shell脚本,这很简单:

enabled=$(jq -r '.content.enabled' <<<"$response")
通过使用shell脚本,这很简单:

enabled=$(jq -r '.content.enabled' <<<"$response")


您是否考虑过使用
jq
?您并不是第一个遇到这种情况的人,这就是为什么我们在知识库中已经有很多(很多!)问题被询问和回答的原因。不需要另一个。@toolic,为什么要删除您的答案?OP可能不喜欢它,但答案是为每个人,而不仅仅是他们;我当然很乐意投我的一票。@user1188611当你之前没有在问题中提到那些约束条件时,提出一个问题,然后驳回不符合你约束条件的答案,这是一种不好的形式。@user1188611,…对于一个有问题的“工作”版本。如果
内容
散列中
id
之前出现
启用
,请查看您的
awk
会做什么。看看如果您试图使用现有代码提取包含逗号、冒号或转义引号的字符串会发生什么。我们强烈鼓励人们使用真正的JSON解析器是有原因的:roll your own方法不可避免地存在缺陷。您是否考虑过使用
jq
?您不是第一个遇到这种情况的人,这就是为什么我们在知识库中已经有很多(很多!)问题被问到和回答了。不需要另一个。@toolic,为什么要删除您的答案?OP可能不喜欢它,但答案是为每个人,而不仅仅是他们;我当然很乐意投我的一票。@user1188611当你之前没有在问题中提到那些约束条件时,提出一个问题,然后驳回不符合你约束条件的答案,这是一种不好的形式。@user1188611,…对于一个有问题的“工作”版本。如果
内容
散列中
id
之前出现
启用
,请查看您的
awk
会做什么。看看如果您试图使用现有代码提取包含逗号、冒号或转义引号的字符串会发生什么。我们强烈鼓励人们使用真正的JSON解析器是有原因的:roll-your-own方法不可避免地有缺陷。我不能使用jq。我在做研究时确实看到了这个选择。这是一个非常旧的机器上运行的代码,我不能安装新的东西。我需要用常规awk或类似的方法来解决这个问题。这就是为什么我用那种方法我不能用jq。我在做研究时确实看到了这个选择。这是一个非常旧的机器上运行的代码,我不能安装新的东西。我需要用常规awk或类似的方法来解决这个问题。这就是为什么我和我的其他评论一样使用这种方法。我不能使用你提到的新图书馆-MJSON::XS@user1188611如果您不想要Perl解决方案,您可能不应该为您的问题添加标签。。。ಠ_ಠ@user1188611关于JSON::PP呢?(见我编辑的答案)@user1188611“我不能使用JSON:PP”为什么不能?它是Perl版本中的核心模块,因此应该已经安装在系统上。运行时是否出现错误?如果是,确切的错误文本是什么?(顺便说一句,它是JSON::PP,有两个冒号,不是一个。)@user1188611,用无关代码(特别是有人试图鼓励你不要使用的无关代码)作为接受答案的条件是。。。不是很好的形式。如果您使用的是基于
awk
的方法的变体,请将其作为您自己的答案发布,并接受它。我不希望它通过投票的方式获得太多(恰恰相反),但这是处理这种情况的正确方式。也就是说,我同样好奇,为什么您不能使用您告诉我们您已经安装的Perl版本的标准库中捆绑的模块。与我的其他评论相同。我不能使用你提到的新图书馆-MJSON::XS@user1188611如果您不想要Perl解决方案,您可能不应该为您的问题添加标签。。。ಠ_ಠ@user1188611关于JSON::PP呢?(见我编辑的答案)@user1188611“我不能使用JSON:PP”为什么不能?它是Perl版本中的核心模块,因此应该已经安装在系统上。运行时是否出现错误?如果是,确切的错误文本是什么?(顺便说一句,它是JSON::PP,有两个冒号,不是一个。)@user1188611,用无关代码(特别是有人试图鼓励你不要使用的无关代码)作为接受答案的条件是。。。不是很好的形式。如果您使用的是基于
awk
的方法的变体,请将其作为您自己的答案发布,并接受它。我不希望它通过投票(而不是c)获得太多