重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
题主是否想询问“linux用什么将文本批量转化为sql”?shell脚本加开源jq命令。linux可以使用shell脚本加开源jq命令批量完成json文件转sql文件。linux是一个操作系统最底层的核心,这个核心可以管理整个计算机的硬件,使计算机的硬件完整的运作起来,并等待使用者输入指令。
成都创新互联公司:从2013年创立为各行业开拓出企业自己的“网站建设”服务,为成百上千家公司企业提供了专业的网站制作、成都网站建设、网页设计和网站推广服务, 按需网站策划由设计师亲自精心设计,设计的效果完全按照客户的要求,并适当的提出合理的建议,拥有的视觉效果,策划师分析客户的同行竞争对手,根据客户的实际情况给出合理的网站构架,制作客户同行业具有领先地位的。
json格式包含有如下的基本类型 : 数字,字符串,false, true, null
而由基本类型组成的复合类型有 : 数组,对象;其中数组是以 [ ] 进行标记的,而对象是以 { } 进行标记;
jq 这个命令用来处理json数据格式,非常方便,简单记录其常用的使用方法如下:
A. 对于数组的处理:
1). 如果 jq 要处理的json是 数组类型,那么用 “ jq .[ ] ” 可以将数组的最外层的[ ] 标记脱掉, 从而变成 对象 类型。
2). 上述命令的 中括号里面可以带有参数,这个参数就是 数组的下标,这个下标从前向后最小是 0,最大值没有限制,如果超出,那么就会return null. 同时支持下标从后向前基数,最小为-1. 但是参数的值除了数字,不可以是空格. 同时数组的下表支持 切片,也就是 [2:7] 或者 [1,2,5,7] 这种格式都是支持的.
B. 对于对象的处理:
1). 因为对象里面的每个元素都是 key:value的形式存在,虽然value 也可以是一个复合类型,但是不影响 key:value 这种格式,所以对于对象,通常用 jq .key 这种方式来获取对应key的value. 其中key 在这里可以不用引号括起来,当然也可以用引号括起来,反正key都是字符串类型。
2). 如果要获得对象所有元素的key值,那么要把 |keys 串接在对象后面,需要注意的是 这里不是利用的shell的管道,而是jq内置的管道,所以属于jq的参数的一部分. 例如:
其实 keys 属性不仅仅支持 对象,也支持json 数组,比如:
3). 判断是否存在某个key.
在上面利用jq内置的 keys 属性,可以获取所有的key, 其实还有jq内置的has 方法,这个方法可以判断对应的key是否存在. 例子如下:
4). jq 的查找结果避免输出 错误,转而输出null
在查找条件的后面加上一个问号,那么如果找不到就不会输出任何的error, 相应的输出一个null来替代. 这个问号可以加在方法的后面(后面的例子中可以看到)。这在递归查找的时候非常有用;否则可能会出现报错的情形.
5). jq 的查找结果为空,避免输出null ,而是什么都不输出
目前不知道怎么实现,暂且用其他的linux 命令来过滤吧
6). 根据指定的关键字查找有该关键字的key,也就是模糊查找
jq 支持PCRE 正则表达式,所以支持模糊搜索, 这里主要展示用scan 方法输出模糊搜索的结果. 用法实例如下:
7). 根据指定的key, 查找嵌套对象中所有该key的value,输出该value
使用 .. 或者 recurse 来表示递归查找,然后通过管道进行常规的查找就可以了,举例如下:
8). 如何将匹配key 的 key 和value 一起进行输出?
以上的命令表示递归方式,获取Key为name的所有key:value对,并以key:value的方式进行输出,但是空的字典对象如何排除呢? 目前还没有发现好的解决方法
9). 因为keys 属性支持对象的同时,也支持数组,所以如何来剔除数组而只是要对象的keys呢?
有一个walk 方法可以实现,但是不常用,所以这里不做讨论.
10).嵌套的模糊查找,上面描述了用scan进行模糊查找,以及用recurse来进行嵌套,如何两者结合呢?
因为scan方法只能够作用于字符串,所以不可以简单的将recurse和scan 结合起来使用,这里需要通过keys来实现 嵌套的模糊查询. 举例如下:
11). 其他使用小tips:
在可以使用 .key1.key2 这种情况下,也可以使用 .key1|.key2 的格式,个人更倾向于使用 .key1|.key2 ,因为看起来更清晰明了. 比如下面的例子.
在大多数情况下我们看到的json 复合格式最外层都是数组的形式,而不是对象的形式,这个是因为什么原因呢? 因为json的对象必须是 key:value 的格式,虽然value 也可以是一个复合格式,但是一定需要key:value 形式,而 数组的不同元素的类型之间没有任何的关联,同一个数组,既可以包含有字符串元素,也可以包含对象元素,还可以包含数字... ,因此一个复合类型的 json格式一般最外层都是数组的形式.
首先用模糊查询,配合递归查找相应的key;-----简言之,就是找到key
然后用特定的key, 配合递归查询找到所有的结果;------简言之,就是依据key遍历到所有的值
最后对上述的结果做进一步的处理得到需要的结果. -----简言之,对得到的值做进一步的过滤获得真正需要的结果
简单例子如下下:
简单总结:
问题:shell下使用jq比较两个json是否相等,第一个难点是KEY需要排序,第二个难点是array需要排序
Jq 本身提供-S参数使key进行排序
不过无法处理array.
jq提供了walk功能可以对所有的key进行遍历,同时他的example1就展示了如何对array进行排序,但apt中提供的jq不具有这个功能。
在github上找到了可以在jq1.5中使用walk的方法
最后写成了这个样子,
JSON 是一种数据表示格式,用于在应用程序的不同层之间存储和传输数据;它将数据存储在键:值对中。在文章中,我们将学习使用 JQ 命令 在 shell 中操作和处理 JSON 数据。
如何安装JQ 命令
在 Centos 8中使用下面命令安装jq:
[root@localhost ~]# dnf -y install jq
语法
现在我们可以开始使用 JQ 命令,因为它已经成功安装在我们的系统上,但首先,让我们看一下 JQ 命令的语法:
jq [options] [file...]
jq [options] --args [strings...]
jq [options] --jsonargs [JSON_TEXTS...]
JQ 命令可以用多种不同的方式使用;它可以直接用于 JSON 文件,也可以结合其他几个命令来解释 JSON 数据。JQ 命令可以与不同的过滤器一起使用,例如“.”、“|”、“,”或“.[]”过滤器来组织 JSON 数据。
JQ 命令还采用不同的选项作为参数,例如 --tab、--stream、--indent n、--unbuffered 和 -L 目录选项。JQ 命令的语法乍一看可能很复杂,但阅读整篇文章后您就会熟悉它。
如何使用 JQ 命令组织 JSON 数据
JQ 命令过滤器最简单和常用的特性。它们用于在将 JSON 数据打印到标准输出时对其进行组织和美化。
在这个例子中,我们有一个名为 employee.json 的 JSON 文件,我们需要将数据输出到标准输出:
{"workers":{"name": "John Brooks","id": "003"}}
我们可以使用 cat 命令来显示数据:
[root@localhost ~]# cat employee.json
{"workers":{"name": "John Brooks","id": "003"}}
使用 cat 命令打印到标准输出的数据是无组织和混乱的。我们可以使用 JQ 命令和“.”来组织这些数据,使用.来筛选:
[root@localhost ~]# jq '.' employee.json
{
"workers": {
"name": "John Brooks",
"id": "003"
}
}
现在,数据变得更有条理、色彩丰富且更易于理解。从 API 访问数据时尤其需要此过滤器;API 中存储的数据可能非常无组织且令人困惑。
如何使用 JQ 命令访问属性
.字段过滤器和 JQ 命令可用于访问 shell 中的对象属性。
如果我们只想访问单个属性并将其打印到标准输出,那么我们可以使用.字段运算符。例如,要访问工人的属性,我们可以使用以下命令:
[root@localhost ~]# jq '.workers' employee.json
{
"name": "John Brooks",
"id": "003"
}
我们还可以使用.字段运算符访问属性中存在的项目。要访问工人属性中的名称项,我们将使用:
[root@localhost ~]# jq '.workers.name' employee.json
"John Brooks"
如何使用 JQ 命令访问数组项
我们还可以使用 .[] 运算符访问和输出 JSON 文件中数组中存在的元素。对于这个例子,我们将修改我们的 JSON 文件,添加下面内容:
[{"name": "John Brooks","id": "003"},{"name": "Randy Park","id": "053"},{"name": "Todd Gray","id": "009"}]
查看一下employee.json文件:
[root@localhost ~]# cat employee.json
[{"name": "John Brooks","id": "003"},{"name": "Randy Park","id": "053"},{"name": "Todd Gray","id": "009"}]
要输出 JSON 文件中存在的所有数组,我们将运行以下命令:
[root@localhost ~]# jq '.[]' employee.json
{
"name": "John Brooks",
"id": "003"
}
{
"name": "Randy Park",
"id": "053"
}
{
"name": "Todd Gray",
"id": "009"
}
要仅输出第二个数组,我们可以通过以下方式修改上述命令:
[root@localhost ~]# jq '.[1]' employee.json
{
"name": "Randy Park",
"id": "053"
}
请记住,数组从索引 0 开始的。
我们还可以使用 .字段 运算符访问数组中存在的属性。例如,如果我们想访问第三个数组中的 name 属性,那么我们将运行以下命令:
[root@localhost ~]# jq '.[2].name' employee.json
"Todd Gray"
类似地,要访问数组中的所有名称属性,我们可以执行以下命令:
[root@localhost ~]# jq '.[].name' employee.json
"John Brooks"
"Randy Park"
"Todd Gray"
总结
JQ 命令用于将 JSON 数据转换为更易读的格式并将其打印到 Linux 上的标准输出。JQ 命令是围绕过滤器构建的,过滤器用于从 JSON 文件中仅查找和打印所需的数据。