Xử lý JSON trên giao diện dòng lệnh Linux

Như chúng ta đã biết, JSON là 1 định dạng dữ liệu mà hiện này được sử dụng rất phỗ biến. Hầu hết các dịch vụ API và data sevices đều sử dụng định dạng JSON. Câu hỏi đặt ra là, làm thế nào để thao tác với định dạng JSON trên giao điện dòng lệnh(command-line)? Bài viết này mình xin giới thiệu cho các bạn 1 công cụ đơn giản và gọn nhẹ để giải quyết vấn đề trên, đó chính là**jq**

Vậyjq là gì?

Trên trang chủ, jq được định nghĩa là:

jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease thatsed,awk,grepand friends let you play with text.

Chan sờ lết to Vietnamese thì chúng ta có thể hiểu:

jq là một JSON processor, nó giống như sed nhưng cho JSON data. Dùng nó kết hợp vớigrep,sedsed. Ta có thể lọc, cắt, ghép các dữ liệu JSON trên giao diện dòng lệnh của Linux.

Cài đặt

Có thể dễ dàng cái đặt theo tài liệu tại https://stedolan.github.io/jq/download Hoặc bằng lệnh:

# download directly into ~/bin
curl http://stedolan.github.io/jq/download/linux64/jq -o ~/bin/jq
# give it executable permissions
chmod a+x ~/bin/jq

Đối với Arch Linux, có thể cài đặt từ pacman -S jq --noconfirm

Sử dụng jq

Giờ hãy bắt đầu xem jq có thể làm được gì. Ví dụ mình có một file JSON như sau:

$ cat test.json
[
  {
    "displayName" : "master",
    "offline" : false
  },
  {
    "displayName" : "agent-1",
    "offline" : true
  },
  {
    "displayName" : "agent-2",
    "offline" : false
  },
  {
    "displayName" : "celery",
    "offline" : false
  },
  {
    "displayName" : "kelp",
    "offline" : false
  },
  {
    "displayName" : "spinach",
    "offline" : false
  },
  {

  }
]

Lấy tất cả các đối tượng

~$ jq '.' test.json
~$ jq '.[]' test.json
{
  "displayName": "master",
  "offline": false
}
{
  "displayName": "agent-1",
  "offline": true
}
{
  "displayName": "agent-2",
  "offline": false
}
{
  "displayName": "celery",
  "offline": false
}
{
  "displayName": "kelp",
  "offline": false
}
{
  "displayName": "spinach",
  "offline": false
}
{}

Kiểm tra độ dài

Giờ thử kiểm tra xem có bao nhiêu đối tượng trong file JSON đó

~$ jq 'length' test.json
7

Kiểm tra mỗi đối tượng có bao nhiêu thuộc tính

~$ jq '.[] | length' test.json
2
2
2
2
2
2
0

Lấy thuộc tính của đối tượng

Tiếp đến thử lấy một đối tượng trong file đó. Ví dụ mình muốn lấy phần tử đầu tiên.

~$ jq '.[0]' test.json

{
  "displayName": "master",
  "offline": false
}

Giờ thử lấy một thuộc tính của một đối tượng. Ví dụ muốn kiểm tra trạng thái của đối tượng số số 2.

~$ jq '.[1].offline' test.json
false

Sort theo một thuộc tính

Ví dụ mình muốn sort theo displayName

~$ jq 'sort_by(.displayName)' test.json
[
  {},
  {
    "displayName": "agent-1",
    "offline": true
  },
  {
    "displayName": "agent-2",
    "offline": false
  },
  {
    "displayName": "celery",
    "offline": false
  },
  {
    "displayName": "kelp",
    "offline": false
  },
  {
    "displayName": "master",
    "offline": false
  },
  {
    "displayName": "spinach",
    "offline": false
  }
]

So sánh, điều kiện

Liệt kê các đối tượng có tên là master

~$ jq '.[].displayName == "master"' test.json
 true
false
false
false
false
false
false

Lời kết

Trên đây là một số xử lý đơn giản, để tìm hiểu thêm về jq bạn có thể truy cập vào trang https://stedolan.github.io/jq/manual/ để đọc thêm. Hẹn gặp lại trong bài viết tiếp theo.

References