Shell获得Curl命令返回的json中的变量值

本文讲述了如何使用curl调用SolrAPI获取查询结果数量,包括通过curl直接获取、结合jq解析JSON,以及在无jq情况下使用grep和awk提取numFound值的方法。
摘要由CSDN通过智能技术生成

前言

最近项目中需要使用curl来call solr的api,获取某个query的数量,并且取得值来和数据库中的数量进行比对,记录一下使用curl调用solr和linux命令积累的一点经验。

使用curl命令,获取solr中query的结果笔数

首先我要通过curl命令获取Solr中一个查询的记录结果数量,这一步可以使用Solr的HTTP API来执行这个操作。以下是一个基本的步骤和示例,演示如何通过curl命令来完成这个任务:

  1. 首先确定你的Solr服务器的URL以及你需要查询的核心(core)或集合(collection)的名称。

  2. 构造你的查询。假设你想要查询所有的记录,你可以使用q=*:*这样的查询。如果有特定的查询条件,你可以按照Solr的查询语法来构造你的查询。

  3. 使用rows=0参数,这样Solr只会返回查询的元数据,不会返回任何记录,这样可以更快地获取记录数。

  4. 使用wt=json参数来指定返回格式为JSON,这样可以方便地解析结果。

假设你的Solr服务器地址是http://localhost:8983/solr,你的核心名称是mycore,以下是一个curl命令的示例:

curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json"

这个命令会返回一个JSON格式的响应,其中包含了查询的结果数量。在返回的JSON中,你可以找到response对象,其下的numFound属性就是匹配查询的记录数。

例如,返回的JSON可能看起来像这样:

  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "response": {
    "numFound": 1234,
    "start": 0,
    "docs": []
  }
}

在这个示例中,numFound的值1234就是查询结果的记录数。这样,你就可以通过解析这个JSON来获取你想要的记录数。

Linux中Shell获得json中的值

第二个问题来了,我得到的是一个json值,我该如何精确的获取到numFound这个变量的值呢?

在Linux环境下,你可以使用命令行工具如curl结合jq来获取返回的JSON中的numFound值。jq是一个轻量级且灵活的命令行JSON处理器,可以用来解析、过滤、映射和生成JSON数据。

首先,确保你的系统中已经安装了jq。如果没有安装,你可以通过包管理器来安装它。例如,在Ubuntu上,你可以使用以下命令安装:

sudo apt-get install jq

然后,你可以结合使用curljq来获取numFound的值。这里是一个示例命令,它使用curl获取Solr查询结果,然后通过管道传递给jq来提取numFound

curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json" | jq '.response.numFound'

在这个命令中:

  • curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json" 会发送请求到Solr服务器并获取JSON格式的响应。
  • | 是管道符,它将前一个命令的输出作为下一个命令的输入。
  • jq '.response.numFound' 会解析传递过来的JSON数据,提取出.response.numFound的值并打印到终端。

执行上述命令后,你会在终端看到numFound的值,这就是查询结果的记录数,通过这种方式可以轻松拿到json中的变量值。

Linux中不使用jq取得json变量的值

那么第三个问题又来了,我的linux服务器,是在客户的内部网络中,无法访问互联网,我也不想安装jq来获取json值,是否还有其他方法可以拿到呢?方法总比困难多,皇天不负有心人,嘿嘿~

如果不想使用jq工具,可以使用其他文本处理工具如grepawksed等来提取numFound的值。

看看怎么通过curlgrepawk来取得json的值吧。

以下是一个使用curlgrepawk来提取numFound值的示例命令:

curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json" | grep -o '"numFound":[0-9]*' | awk -F':' '{print $2}'

在这个命令中:

  • curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json" 同样是用来发送请求并获取返回的JSON数据。
  • grep -o '"numFound":[0-9]*' 使用-o选项输出与模式匹配的部分,这里的模式"numFound":[0-9]*用于匹配"numFound"及其后的数字。
  • awk -F':' '{print $2}' 使用awk来处理grep的输出。-F':'指定分隔符为冒号,'{print $2}'表示打印第二个字段(即numFound的值)。

这个命令会从Solr返回的JSON中提取numFound的值并打印出来。d但是我们需要注意的是,这种方法依赖于返回的JSON格式相对固定,如果JSON结构有大的变化,这个命令可能需要相应地调整。

在我的另一个需求中,我要取的一个变量id中不是单纯的数字,而是数字字母和‘-’的组合体,
于是调整了grep命令中的正则表达式来匹配这种更复杂的模式。下面是一个修改后的命令示例,它可以捕获包含数字、字母和’-'的numFound值:

curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json" | grep -o '"numFound":[0-9a-zA-Z-]*' | awk -F':' '{print $2}'

在这个命令中:

  • grep -o '"numFound":[0-9a-zA-Z-]*' 修改了正则表达式,使其能够匹配数字(0-9)、字母(a-zA-Z)和’-‘符号。这里[0-9a-zA-Z-]*意味着匹配任意数量的数字、字母或’-'。

顺利搞定工作的感觉真好,加油😜~

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值