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 ...
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,sedvàsed. 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
- https://stedolan.github.io/jq/manual/
- https://kipalog.com/posts/Xu-ly-JSON-tren-giao-dien-dong-lenh-Linux
- http://www.compciv.org/recipes/cli/jq-for-parsing-json/