Shell获得Curl命令返回的json值

本文涉及的产品
大数据开发治理平台 DataWorks,不限时长
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 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-]*意味着匹配任意数量的数字、字母或'-'。

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

目录
相关文章
|
2月前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
2月前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
24天前
|
存储 Shell 数据安全/隐私保护
Shell 内建命令:Shell 的内在魔力
Shell 内建命令比外部命令执行快,不需额外进程。`type` 命令用来检查命令类型。内建命令如 `cd`、`alias` 和 `echo` 直接在 Shell 中执行,不涉及磁盘 I/O。`type` 示例展示了 `cd` 是内建的,`ifconfig` 是外部的。`bash` 包含多种内建命令,如 `cd` 用于切换目录,`alias` 定义别名,`read` 从输入读取数据。`echo` 默认加换行,`echo -n` 可避免。
25 5
|
24天前
|
Shell 虚拟化
分布式系统详解--框架(Zookeeper-基本shell命令)
分布式系统详解--框架(Zookeeper-基本shell命令)
21 1
|
27天前
|
安全 Shell Linux
探索Linux命令chsh:更改用户的默认shell
`chsh`是Linux命令,用于更改用户的默认登录shell。它涉及用户环境配置和系统安全,允许用户选择更适合自己的shell以提升效率。命令有交互式选项和参数如`-s`来指定新shell。在使用时要注意新shell的可执行性、权限问题及选择合适的shell。例如,要更改为bash,用户可运行`chsh`后按提示操作,而root用户能用`sudo chsh -s /bin/zsh john`为用户`john`设定zsh。在更改前,确认shell路径、权限,并了解不同shell的特点。
|
1月前
|
JSON PHP 数据格式
蓝易云 - PHP用CURL发送Content-type为application/json的POST请求方法
在这段代码中,我们首先创建了一个包含我们要发送的数据的数组,并使用 `json_encode`函数将其转换为JSON格式。然后,我们初始化了一个cURL会话,并设置了一些选项,包括POST请求方法、要发送的数据、返回结果和HTTP头部信息。最后,我们执行了cURL请求并关闭了会话。
33 2
|
24天前
|
分布式计算 Hadoop Shell
分布式系统详解--框架(Hadoop-基本shell命令)
分布式系统详解--框架(Hadoop-基本shell命令)
14 0
|
28天前
|
Shell
Shell [[]] 命令:条件判断的升级版
`[[ ]]` 是 Bash 中增强型的条件判断命令,提供比 `[ ]` 更多的灵活性,如无需引号包裹变量、直接字符串比较及正则支持。例如: ```markdown - 不加引号比较:`[[ -z $str1 ]]` - 逻辑运算:`[[ -z $str1 ]] || [[ -z $str2 ]]` - 正则匹配:`[[ $phone =~ ^1[0-9]{10}$ ]]` ``` 它不支持 `-a` 和 `-o`,但能用 `&&` 和 `||` 进行逻辑操作。用于复杂字符串验证和文件处理时非常有用。
19 0
|
28天前
|
Shell Windows
Shell test [] 命令:条件判断的艺术
`test` 命令在Shell脚本中用于条件检测,涉及数值、字符串和文件比较。例如,`test $a -eq $b` 检查两个数是否相等;`-e` 检查文件是否存在;`-w` 检查文件是否可写。数值比较不支持 `>=` 和 `<=`,需用 `-ge` 和 `-le`。字符串比较时注意空值,使用双引号。逻辑运算包括 `-a`(与)、`-o`(或)和 `!`(非)。文件类型和权限检测也是`test`的重要用途。
13 0
|
2月前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)