Phát hành jq 1.7
(github.com/jqlang)- Đã loại bỏ tùy chọn
--argfile, cùng với các bộ lọcleaf_pathsvàrecurse_down, vốn đã ngừng được hỗ trợ - Ảnh Docker hiện được cung cấp tại
ghcr.io/jqlang/jqthay vì Docker Hub - Các mục tiêu build phát hành nêu rõ nhiều kiến trúc cho Linux, macOS, Windows và Docker
- Đã bổ sung
--raw-output0, cho phép chèn byte NUL giữa các đầu ra; việc xuất chuỗi có chứa NUL sẽ được xử lý như lỗi - Trên Windows, đã thêm tùy chọn
--binary/-bđể có thể xuất kết thúc dòng\nthay vì\r\n - Có thể thiết lập màu cho khóa đối tượng bằng
JQ_COLORS, và việc xuất màu sẽ bị tắt nếu có biến môi trườngNO_COLOR - Đã sửa vấn đề về mã thoát của tùy chọn
--exit-code/-e: nếu giá trị đầu ra cuối cùng là đúng thì trả về 0, nếu làfalsehoặcnullthì trả về 1, và nếu không có đầu ra thì trả về 4 - Sử dụng literal số thập phân để bảo toàn độ chính xác của literal số; các phép so sánh tôn trọng độ chính xác này, nhưng phép toán số học có thể bị cắt bớt
- Đã thêm các hàm tích hợp mới
pick(stream),debug(msgs),scan($re; $flags),abs - Trong câu lệnh
if, có thể bỏ qua nhánhelse;elsebị lược bỏ sẽ được xử lý như hành vi. haltvàhalt_errorgiờ sẽ kết thúc ngay lập tức thay vì tiếp tục sang đầu vào kế tiếp- Đã sửa lỗi biểu diễn số lớn tạo ra đầu ra JSON sai trên một số nền tảng, lỗi phân đoạn khi dùng libjq cùng luồng, và lỗi assert crash của
--jsonarg - CI, scan build, phát hành và build website đã được chuyển sang dùng GitHub Actions, đồng thời bổ sung OSS-Fuzz
1 bình luận
Ý kiến trên Hacker News
Thực sự rất thích JQ vì nó tuyệt vời
Trong sản phẩm của chúng tôi (công cụ Kafka dựa trên JVM và trình duyệt), chúng tôi đã triển khai một tập con của JQ bằng Clojure để người dùng có thể xử lý/lọc dữ liệu. Đó là một trong những việc thú vị nhất trong số các đoạn code tôi từng viết, và vì tôi vốn thích tự viết cú pháp, tôi cũng rất biết ơn Instaparse: https://github.com/Engelberg/instaparse
Khi triển khai, tôi phát hiện JQ là LISP-2, điều này làm tôi ngạc nhiên vì chỉ nhìn cú pháp thì không có cảm giác như vậy: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...
Nhưng tôi khó chịu với cú pháp truy vấn không trực quan, việc phải tra cứu gần như ở từng bước rất nhỏ, và kết quả trông như thần chú mà nếu không phải chuyên gia jq thì rất khó giải mã. Tôi có cảm giác bài xích bản năng với các DSL nói chung bị nhét vào trong chuỗi, như htmx hay tailwind
Dù vậy, tôi cũng thừa nhận đây là phần mềm được làm tốt, và đôi khi không có lựa chọn nào tốt hơn. Khi xử lý JSON trong bash, nó cũng là lựa chọn ít tệ nhất theo nghĩa tốt hơn nhiều so với những con quái vật sed/awk/cut. Chỉ là các lệnh jq lúc nào cũng cắm giữa script như một chuỗi không thể giải mã, cùng với regex, gần như là những thứ tôi không muốn thấy trong code. Tôi từng thử phương án thay thế là pipe inline Python trong heredoc, nhưng cách đó cũng trở nên bừa bộn chẳng kém script jq
Chọn "Jq parser (partially working)" trong ví dụ rồi nhấn "Parse" để xem cây parser cho mã trong "Input source". Luôn hoan nghênh mọi phản hồi
jq làm cho phần lớn trường hợp trở nên đơn giản (về cơ bản là ký pháp dấu chấm của JSON), đồng thời vẫn xử lý được cái đuôi dài các trường hợp phức tạp
Tôi thích jq, nhưng cũng dùng JMESPath (đặc biệt cùng với AWS CLI), yq (bao gồm cả tomlq và xq), và dasel. Tiếc là hclq gần như đã chết
https://jmespath.org/
https://kislyuk.github.io/yq/
https://github.com/TomWright/dasel
https://hclq.sh/
Tôi đã dùng
jqnhiều năm và lúc nào cũng bằng cách nào đó ghép được thứ mình cần, nhưng đến giờ vẫn chưa bao giờ thấy nó trực quan. Chỉ cần hơi phức tạp là khó tìm ra lời giải nếu không đọc tài liệu khá lâu, và tôi ước nó có thể dễ dùng hơnNó đã giúp tôi khi mới học cú pháp, và đến giờ nếu vướng vào cú pháp lạ tôi vẫn quay lại xem
Công dụng lớn nhất là chuyển những thứ như CSV, TOML, XML sang JSON rồi pipe vào jq: https://github.com/sentriz/rsl
https://github.com/kellyjonbrazil/jello
https://github.com/wwkimball/yamlpath
Lấy cảm hứng từ XPath nên quen thuộc hơn so với một DSL hoàn toàn mới, và tôi cho rằng tính năng cốt lõi là truy vấn khóa đệ quy. Viết
people..addresssẽ tìm mọi khóa "address" nằm dưới "people" ở bất cứ đâu trong JSON. Đây là ngôn ngữ phân tích cú pháp cho JSON mà tôi thích nhất, và tôi cũng đã viết một bài giới thiệu cách dùng nó để phân tích tập dữ liệu JSONhttps://github.com/JSONPath-Plus/JSONPath
https://scrapfly.io/blog/parse-json-jsonpath-python/
Nếu chỉ thỉnh thoảng mới dùng jq nên lần nào cũng phải xem tài liệu, gron rất đáng thử. Đó là JSON có thể grep được
https://github.com/tomnomnom/gron
Tôi đã dùng
curl cheat.sh/jqsuốt vài năm, và thấy cheat.sh nói chung là một nguồn tài liệu tuyệt vời. Nếu là bây giờ thì có lẽ tôi sẽ dùng thứ gì đó như ChatGPTCũng có thể làm kiểu
gron | grep | sed | gron -uMột trong những lý do khiến tôi thích, hoặc có thể chịu được jq, là tính ổn định. Các script viết từ vài năm trước đến giờ vẫn chạy y như cũ
Ngược lại, code tôi để dành cho yq thường xuyên bị hỏng khi yq liên tục được cải tiến theo những cách không tương thích ngược. Tôi chưa điều tra xem các thay đổi như vậy xảy ra thường xuyên đến mức nào, nhưng đã bị ảnh hưởng nhiều lần ở những nơi như script CI, nơi phiên bản công cụ mặc định mỗi nơi một khác và tốc độ cập nhật cũng khác nhau
Vì vậy tôi luôn biết ơn các maintainer của jq vì họ hiểu tầm quan trọng của tương thích ngược. Hy vọng thông báo lần này không có nghĩa là sự ổn định đó chỉ là sản phẩm phụ tình cờ của tình trạng trì trệ, và khi khắc phục sự trì trệ thì sẽ hy sinh tính ổn định
https://kislyuk.github.io/yq/
https://github.com/kyle-long/yq#yq
https://github.com/up1/yq-1#yq-command-line-yamlxml-processo...
https://github.com/onixspot/yq-2#yq-command-line-yamlxmltoml...
https://github.com/simonrupf/convert2json#convert2json
Ngoài các công cụ giống jq, còn có những công cụ thú vị dùng cùng jq là jo và jc
https://github.com/jpmens/jo
https://github.com/kellyjonbrazil/jc
Tôi mới nghe đến gron lần đầu ở đây, nhưng thêm vào cho đầy đủ. Mặt khác, có vẻ JSON đang dần trở thành định dạng xuất chuẩn của các công cụ CLI. Lý tưởng nhất là mọi công cụ CLI đều cung cấp một flag như
--json, để jc không còn cần thiết nữahttps://jless.io/
https://github.com/tomnomnom/gron
Bài liên quan tháng trước “First release of jq in 5 years”: https://news.ycombinator.com/item?id=36951830
Tôi là fan cuồng của jq và lúc nào cũng dùng nó
Cuối cùng cũng xong
Quá trình cộng đồng chung sức tuyển maintainer mới và hồi sinh dự án thật sự rất tuyệt. Đặc biệt cảm ơn @stedolan, @itchyny, @owenthereal theo username GitHub
jq và miller là những món không thể thiếu trong bộ công cụ của tôi, cùng với awk và vim
https://github.com/johnkerl/miller
Hàm tích hợp mới
pick(stream)thêm khả năng xuất ra projection của object hoặc array đầu vàojq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'Đây đúng là một tính năng cứu cánh. Cảm ơn các contributor
$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'{"a": 1,"e": 4}pickhoạt động được cả với dữ liệu streamingTôi cũng muốn giới thiệu jaq. Đây là một clone của jq tập trung vào độ chính xác, tốc độ và sự đơn giản
Nó chỉ triển khai một tập con của jq, nhưng đến giờ tôi dùng khá hài lòng: https://github.com/01mf02/jaq