Shell获得Curl命令返回的json值

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 使用curl命令,获取solr中query的结果笔数Linux中Shell获得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命令的示例:

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

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

目录
相关文章
|
5天前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
15 1
|
1月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
62 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
Shell 知识图谱
Shell printf 命令
10月更文挑战第3天
19 1
|
1月前
|
Unix Shell Linux
常见的shell命令
shell常用命令
39 11
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
55 5
|
1月前
|
Shell PHP
Shell echo命令
10月更文挑战第3天
20 0
|
1月前
|
JSON Java Shell
Dockerfile中RUN、CMD、ENTRYPOINT、SHELL命令的区别
理解这些指令的差异和应用场景,有助于构建高效、灵活且易于管理的Docker镜像。在实际应用中,根据需要选择合适的指令,可以有效地控制镜像构建和容器运行的行为。
144 0
|
1月前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
64 0
|
3月前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!