首页 > 系统相关 >【Linux系列】掌握jq:高效处理JSON数据的命令行利器

【Linux系列】掌握jq:高效处理JSON数据的命令行利器

时间:2024-06-11 23:56:03浏览次数:30  
标签:00 PackageKit mirrors jq JSON yum Linux

jq 是一个强大的命令行工具,以其简洁的语法和丰富的功能,成为处理JSON数据的首选。本文旨在通过实战示例,让你迅速上手jq,掌握提取信息、美化输出和数据压缩的核心技能。

一、安装jq:开启高效之旅

首先,确保你的系统中安装了jq。在大多数Linux发行版中,可以通过包管理器安装,例如:

# Ubuntu/Debian
sudo apt-get install jq

# CentOS/RHEL
sudo yum install epel-release
sudo yum install jq

# macOS (使用Homebrew)
brew install jq
安装记录,如下:

[root@localhost lyj]# yum install epel-release

Loaded plugins: fastestmirror, langpacks
Existing lock /var/run/yum.pid: another copy is running as pid 2658.
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: PackageKit
    Memory : 269 M RSS (696 MB VSZ)
    Started: Wed Jun 12 07:00:02 2024 - 00:54 ago
    State  : Sleeping, pid: 2658
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: PackageKit
    Memory : 269 M RSS (696 MB VSZ)
    Started: Wed Jun 12 07:00:02 2024 - 00:56 ago
    State  : Sleeping, pid: 2658
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: PackageKit
    Memory : 269 M RSS (696 MB VSZ)
    Started: Wed Jun 12 07:00:02 2024 - 00:58 ago
    State  : Sleeping, pid: 2658
....

俺也不知道咋回事,第一次遇到。
没事问AI。

AI:

看起来`yum`软件包管理器上有另一个应用程序(`PackageKit`)造成的锁定。消息表明`PackageKit`当前持有`yum`锁,阻止其他`yum`进程运行,直到释放锁。

要解决此问题,您可以尝试以下步骤:

1. **等待锁定释放**:消息显示`PackageKit`已经运行了一段时间。您可以等一段时间,看看是否锁会自动释放。

2. **终止进程**:如果等待不起作用,您可以尝试终止持有锁的`PackageKit`进程。您可以使用以下命令查找`PackageKit`进程的PID,然后将其终止:

    ```bash
    ps -aux | grep PackageKit
    ```

    这条命令会显示`PackageKit`进程的PID。然后,您可以使用以下命令将其终止:

    ```bash
    sudo kill -9 <PID>
    ```

    将`<PID>`替换为`PackageKit`进程的实际PID。

3. **删除锁文件**:如果终止进程不起作用,您可以手动删除锁文件。锁文件通常位于`/var/run/yum.pid`。您可以使用以下命令删除它:

    ```bash
    sudo rm -f /var/run/yum.pid
    ```

执行这些步骤后,您应该能够使用`yum`安装`jq`而无任何问题。

新问题又来了:


[root@localhost lyj]# yum install epel-release

Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
epel/x86_64/metalink                                                                                                                                 |  14 kB  00:00:00     
 * base: mirrors.ustc.edu.cn
 * centos-sclo-rh: mirrors.ustc.edu.cn
 * centos-sclo-sclo: mirrors.ustc.edu.cn
 * epel: mirrors.ustc.edu.cn
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.ustc.edu.cn
base                                                                                                                                                 | 3.6 kB  00:00:00     
centos-sclo-rh                                                                                                                                       | 3.0 kB  00:00:00     
centos-sclo-sclo                                                                                                                                     | 3.0 kB  00:00:00     
epel                                                                                                                                                 | 4.3 kB  00:00:00     
extras                                                                                                                                               | 2.9 kB  00:00:00     
https://dlm.mariadb.com/repo/mariadb-server/11.3/yum/rhel/7/x86_64/repodata/repomd.xml: [Errno 14] curl#7 - "Failed to connect to 2606:4700::6812:8718: Network is unreachable"
Trying other mirror.
https://dlm.mariadb.com/repo/mariadb-server/11.3/yum/rhel/7/x86_64/repodata/repomd.xml: [Errno 12] Timeout on https://dlm.mariadb.com/repo/mariadb-server/11.3/yum/rhel/7/x86_64/repodata/repomd.xml: (28, 'Operation timed out after 30002 milliseconds with 0 out of 0 bytes received')
Trying other mirror.

感觉要换源❗❗❗

❗注意

由于 jq 可能不包含在默认的CentOS仓库中,所以需要安装EPEL(Extra Packages for Enterprise Linux)存储库以获取jq的软件包。

二、提取特定信息:直击核心数据

假设我们有一个名为data.json的文件,内容如下:

{
  "users": [
    {"name": "ZhangSan", "age": 25},
    {"name": "LiSi", "age": 30}
  ]
}

如果我们想要提取所有用户的名字,可以使用以下 jq 命令:

cat data.json | jq '.users[].name'
# 或者
jq '.users[].name' data.json

小贴士:在 jq 的上下文中,'.' 是一个特殊的表达式,它表示JSON数据的根对象。

执行上述命令后,会得到以下输出:

"ZhangSan"
"LiSi"

这表明我们已成功提取了所有用户的名字。

三、格式化JSON:清晰查看JSON结构

当JSON数据被压缩或编码为单行时,它可能很难阅读。jq 的默认行为是输出格式化的JSON。对于data.json,可以使用以下命令进行格式化:

jq '.' data.json
#或者
cat data.json | jq

执行后,你会看到JSON数据被格式化为多行,每个属性都单独占一行,这使得数据更易于阅读和理解:

{
  "users": [
    {
      "name": "ZhangSan",
      "age": 25
    },
    {
      "name": "LiSi",
      "age": 30
    }
  ]
}

四、紧凑化JSON:优化存储与传输

我们通常需要删除不必要的空格和换行符以节省存储空间或加快传输速度。jq 也提供了一个 -c 选项,可以将JSON输出为紧凑格式。这有助于减少文件大小,使其更适合某些场景。

使用以下命令可以将JSON数据紧凑化:

jq -c '.' data.json

执行后,你会看到JSON数据被输出为单行格式,没有多余的空格和换行符。这种格式虽然不易读,但占用的空间更小,便于网络传输。

总结

通过这些实例,你已经掌握了 jq 在日常开发中的基本应用。

然而,jq 的潜力远不止于此,它拥有极其丰富的功能集,能够轻松应对各种复杂的数据处理和分析场景。未来我将继续分享 jq 的更多高级用法和技巧。

原创 1024夜谭

标签:00,PackageKit,mirrors,jq,JSON,yum,Linux
From: https://www.cnblogs.com/o-O-oO/p/18242980

相关文章

  • Exercise:JSON解析
    练习:利用某些平台(聚合API、百度A、科大讯飞API)的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cISON库对服务器的响应数据进行解析,并输出到终端。/************************************************************************************************......
  • Linux 蜂鸣器实验
    Linux蜂鸣器实验1、修改设备树文件I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1这个PIN,打开imx6ull-alientekemmc.dts,在iomuxc节点的imx6ul-evk子节点下创建一个名为“pinctrl_beep”的子节点,节点内容如下所示:pinctrl_beep:beepgrp{ fsl,pins=< MX6ULL_PAD_SNVS_TA......
  • 基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架
    #include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<errno.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/ip.h>#include<arpa/inet.h>#include<sys/socket.h&g......
  • 酷游网址:如何在Linux 上安装Python、pip 和EB CLI
    由酷游网址вт989点сс编译,要如何在Linux上安装Python、pip和EBCLI呢?EBCLI需要Python2.7、3.4或更新版本。如果您的发行版本没有随附Python,或者随附了旧版本,请在安装pip和EBCLI之前先安装Python。在Linux上安装Python3.7判断是否已安装Python。$python--ve......
  • LINUX系统优化
    LINUX系统优化企业生产场景中Linux系统的分区方案及内核企业生产场景中Linux系统的分区方案常规的分区方案如下:方案1:针对网站集群架构中的某个节点服务器分区,该服务器上的数据有多份(其他节点也有)且数据不太重要,建议的分区方案如下。/boot:设置为100~200MB。swap:物理内......
  • Linux——线程池
    目录一、什么是线程池二、线程池的优点三、线程池的应用四、实现一个简单的线程池五、单例模式5.1、饿汉实现方式5.2、 懒汉实现方式5.3、 单例模式实现线程池(懒汉方式)六、其他常见的各种锁一、什么是线程池        线程池是线程的一种使用模式。在前面......
  • http与cJSON练习
    http与cJSON练习/*****************************************************************************************************weather_test.c*练习tcp连接,与http协议,调用服务器接口,实现获取特定城市的天气信息,并用cJSO......
  • 利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJ
    目录题目分析代码结果题目利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端分析1.需从源代码网站GitHub或SourceForge代码网站下载cJSON库及阅读下载的README相关手册如何使用cJSON库;2.使用......
  • 嵌入式Linux中的LED驱动控制(续)
    前面的实例实现了在野火STM32MP157开发板上对三个LED灯的控制,这里来讨论一下该驱动程序的具体实现方式。由于实例使用的是STM32MP157这款芯片,所以先来看一下与该芯片端口操作相关的寄存器。先看端口模式寄存器MODER,该类型的寄存器在STM32MP157中有11个,即x的值从A到K。它们分别针......
  • 网络编程练习题---利用cJSON库对服务器返回的JSON格式数据完成解析
    目录题目注意事项实现代码结果展示相关接口指引题目利用某些平台(聚合API、百度AI、科大讯飞API)的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端。注意事项1.预测的日期开始时间为2010-01-012."老黄历"API......