Shell获得Curl命令返回的json值

前言

最近项目中需要使用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命令的示例:

arduino 复制代码
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上,你可以使用以下命令安装:

arduino 复制代码
sudo apt-get install jq

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

arduino 复制代码
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值的示例命令:

perl 复制代码
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值:

perl 复制代码
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-]*意味着匹配任意数量的数字、字母或'-'。

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

相关推荐
PyAIGCMaster29 分钟前
ubuntu装P104驱动
linux·运维·ubuntu
奈何不吃鱼29 分钟前
【Linux】ubuntu依赖安装的各种问题汇总
linux·运维·服务器
icy、泡芙31 分钟前
T527-----音频调试
linux·驱动开发·音视频
aherhuo34 分钟前
kubevirt网络
linux·云原生·容器·kubernetes
zzzhpzhpzzz43 分钟前
Ubuntu如何查看硬件型号
linux·运维·ubuntu
蜜獾云1 小时前
linux firewalld 命令详解
linux·运维·服务器·网络·windows·网络安全·firewalld
o(╥﹏╥)1 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
娶不到胡一菲的汪大东1 小时前
Ubuntu概述
linux·运维·ubuntu
Yuan_o_2 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
那就举个栗子!2 小时前
Ubuntu 20.04下Kinect2驱动环境配置与测试【稳定无坑版】
linux·ubuntu