เปิดตัว jq 1.7
(github.com/jqlang)- นำ ตัวเลือก
--argfileและฟิลเตอร์leaf_paths,recurse_downที่เคยประกาศเลิกสนับสนุนแล้วออก - อิมเมจ Docker ให้บริการที่
ghcr.io/jqlang/jqแทน Docker Hub - ระบุเป้าหมายบิลด์สำหรับรีลีสครอบคลุมหลายสถาปัตยกรรมของ Linux, macOS, Windows และ Docker
- เพิ่ม
--raw-output0เพื่อแทรก ไบต์ NUL ระหว่างเอาต์พุต และจะจัดการเป็นข้อผิดพลาดหากพิมพ์สตริงที่มี NUL - บน Windows เพิ่มตัวเลือก
--binary/-bเพื่อให้สามารถพิมพ์ตัวจบบรรทัดเป็น\nแทน\r\nได้ - สามารถตั้งค่าสีของคีย์อ็อบเจ็กต์ด้วย
JQ_COLORSและปิดการแสดงผลสีโดยเคารพตัวแปรสภาพแวดล้อมNO_COLOR - แก้ปัญหารหัสออกของตัวเลือก
--exit-code/-eโดยจะคืนค่า 0 เมื่อค่าเอาต์พุตสุดท้ายเป็นจริง, 1 เมื่อเป็นfalseหรือnull, และ 4 เมื่อไม่มีเอาต์พุต - ใช้ลิเทอรัลตัวเลขฐาน 10 เพื่อ คงความแม่นยำ ของลิเทอรัลตัวเลข โดยการเปรียบเทียบจะคงความแม่นยำ แต่การคำนวณเลขคณิตอาจถูกตัดทอน
- เพิ่มฟังก์ชันในตัวใหม่
pick(stream),debug(msgs),scan($re; $flags),abs - ในคำสั่ง
ifสามารถละสาขาelseได้ และelseที่ละไว้จะถูกทำงานเป็น. - เปลี่ยนให้
haltและhalt_errorจบทันทีโดยไม่ดำเนินต่อไปยังอินพุตถัดไป - แก้ปัญหาการสร้างเอาต์พุต JSON ผิดพลาดจากการแสดงผลตัวเลขขนาดใหญ่บนบางแพลตฟอร์ม, segmentation fault เมื่อใช้ libjq กับเธรด, และ assert crash ของ
--jsonarg - เปลี่ยน CI, สแกนบิลด์, รีลีส และการบิลด์เว็บไซต์ให้ใช้ GitHub Actions พร้อมเพิ่ม OSS-Fuzz
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
JQ ยอดเยี่ยมมาก เลยชอบจริง ๆ
ในผลิตภัณฑ์ของเรา (เครื่องมือ Kafka ที่ทำงานบน JVM และเบราว์เซอร์) เราได้ implement subset ของ JQ ด้วย Clojure เพื่อให้ผู้ใช้สามารถแปลง/กรองข้อมูลได้ นี่เป็นหนึ่งในงานที่สนุกที่สุดเท่าที่เคยเขียนโค้ดมา และผมก็เป็นคนที่ชอบเขียนไวยากรณ์อยู่แล้ว จึงต้องขอบคุณ Instaparse อย่างมากด้วย: https://github.com/Engelberg/instaparse
ระหว่าง implement ผมพบว่า JQ เป็น LISP-2 ซึ่งน่าประหลาดใจ เพราะดูจากไวยากรณ์อย่างเดียวไม่รู้สึกแบบนั้นเลย: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...
แต่สิ่งที่ขัดใจคือ ไวยากรณ์ query ที่ไม่เป็นธรรมชาติ ต้องค้นหาทุกขั้นตอนยิบย่อย และผลลัพธ์ก็ออกมาเหมือนคาถาที่ถอดความยากถ้าไม่ใช่ผู้เชี่ยวชาญ jq ผมมีแรงต้านโดยสัญชาตญาณต่อ DSL โดยรวมที่ถูกฝังอยู่ในสตริงแบบ htmx หรือ tailwind
ถึงอย่างนั้นก็ยอมรับว่าเป็นซอฟต์แวร์ที่ทำมาดี และบางครั้งก็ไม่มีตัวเลือกที่ดีกว่า ในแง่ของการจัดการ JSON ใน bash มันเป็น ตัวเลือกที่แย่น้อยที่สุด เมื่อเทียบกับสัตว์ประหลาด sed/awk/cut เพียงแต่คำสั่ง jq ที่ฝังอยู่กลางสคริปต์เหมือนสตริงที่อ่านไม่ออกเสมอนั้น จัดอยู่ในกลุ่มสิ่งที่ไม่ค่อยอยากเห็นในโค้ดพอ ๆ กับ regex ผมเคยลองทางเลือกด้วยการ pipe inline Python ใน heredoc แต่สุดท้ายก็เละเทะพอ ๆ กับสคริปต์ jq
เลือก "Jq parser (partially working)" ในตัวอย่าง แล้วกด "Parse" ก็จะเห็น parser tree สำหรับซอร์สใน "Input source" ยินดีรับฟีดแบ็กเสมอ
jq ทำให้กรณีส่วนใหญ่ง่ายขึ้น (โดยพื้นฐานคือ dot notation ของ JSON) และยังรองรับกรณีซับซ้อนแบบ long tail ได้ด้วย
ผมชอบ jq แต่ก็ใช้ JMESPath (โดยเฉพาะกับ AWS CLI), yq (รวม tomlq และ xq), dasel ด้วย เสียดายที่ hclq แทบจะตายไปแล้ว
https://jmespath.org/
https://kislyuk.github.io/yq/
https://github.com/TomWright/dasel
https://hclq.sh/
ใช้
jqมาหลายปีแล้ว และสิ่งที่ต้องการก็มักประกอบขึ้นมาได้เสมอ แต่ก็ยังไม่เคยรู้สึกว่ามันเป็นธรรมชาติเลย พอซับซ้อนขึ้นนิดหน่อยก็ยากที่จะไปถึงวิธีแก้โดยไม่ต้องอ่านเอกสารอยู่นาน และอยากให้มันใช้ง่ายกว่านี้ช่วยตอนเรียนไวยากรณ์ครั้งแรก และตอนนี้ถ้าติดไวยากรณ์แปลก ๆ ก็ยังกลับไปดูอยู่
การใช้งานหลักที่สุดคือ แปลงเป็น JSON อย่าง CSV, TOML, XML แล้ว pipe ไปให้ jq: https://github.com/sentriz/rsl
https://github.com/kellyjonbrazil/jello
https://github.com/wwkimball/yamlpath
ได้แรงบันดาลใจจาก XPath จึงคุ้นเคยกว่า DSL ใหม่ทั้งหมด และผมมองว่าฟีเจอร์หลักคือการค้นหาคีย์แบบ recursive ถ้าเขียน
people..addressก็จะค้นหาคีย์ "address" ทั้งหมดที่อยู่ใต้ "people" ที่ใดก็ได้ใน JSON เป็นภาษาสำหรับ parse JSON ที่ผมชอบที่สุด และผมยังเขียนบทความแนะนำวิธีใช้มันในการ parse ชุดข้อมูล JSON ด้วยhttps://github.com/JSONPath-Plus/JSONPath
https://scrapfly.io/blog/parse-json-jsonpath-python/
ถ้าใช้ jq แค่นาน ๆ ครั้งจนต้องเปิดเอกสารดูทุกครั้ง gron ก็น่าลองใช้ เป็น JSON ที่ grep ได้
https://github.com/tomnomnom/gron
ใช้
curl cheat.sh/jqมาหลายปีแล้ว และมองว่า cheat.sh โดยรวมเป็นแหล่งข้อมูลที่ยอดเยี่ยม ถ้าเป็นสมัยนี้ก็คงใช้บางอย่างอย่าง ChatGPT แทนทำแบบ
gron | grep | sed | gron -uก็ได้ด้วยหนึ่งในเหตุผลที่ชอบ jq หรือพอทนใช้ได้คือ ความเสถียร สคริปต์ที่เขียนไว้เมื่อหลายปีก่อนยังทำงานได้เหมือนเดิมจนถึงตอนนี้
ในทางกลับกัน โค้ดที่เก็บไว้สำหรับ yq มักพังบ่อย เพราะ yq ปรับปรุงต่อเนื่องในแบบที่ไม่เข้ากันย้อนหลัง ไม่ได้ตรวจสอบว่ามีการเปลี่ยนแปลงแบบนั้นบ่อยแค่ไหน แต่ได้รับผลกระทบหลายครั้งในที่อย่างสคริปต์ CI ซึ่งเวอร์ชันเครื่องมือพื้นฐานแตกต่างกันไปและอัตราการอัปเดตก็ไม่เท่ากัน
ดังนั้นจึงรู้สึกขอบคุณเสมอที่ผู้ดูแล jq เข้าใจความสำคัญของ ความเข้ากันได้ย้อนหลัง หวังว่าประกาศครั้งนี้จะไม่ได้หมายความว่าความเสถียรนั้นเป็นเพียงผลพลอยได้โดยบังเอิญจากการหยุดนิ่ง และการแก้ความหยุดนิ่งจะต้องแลกด้วยความเสถียร
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
นอกจากเครื่องมือคล้าย jq แล้ว ยังมีเครื่องมือที่น่าสนใจสำหรับใช้ร่วมกับ jq อย่าง jo และ jc
https://github.com/jpmens/jo
https://github.com/kellyjonbrazil/jc
เพิ่งได้ยินชื่อ gron ครั้งแรกที่นี่ แต่ขอเสริมเพื่อความครบถ้วน ในขณะเดียวกัน JSON ก็ดูเหมือนกำลังกลายเป็นรูปแบบเอาต์พุตมาตรฐานของเครื่องมือ CLI ตามอุดมคติคือเครื่องมือ CLI ทุกตัวควรมีแฟล็กอย่าง
--jsonเพื่อให้ไม่ต้องใช้ jc อีกต่อไปhttps://jless.io/
https://github.com/tomnomnom/gron
บทความที่เกี่ยวข้องเมื่อเดือนก่อน "First release of jq in 5 years": https://news.ycombinator.com/item?id=36951830
เป็นแฟนตัวยงของ jq และใช้ตลอด
ในที่สุดก็สำเร็จ
กระบวนการที่ชุมชนร่วมแรงกันสรรหาผู้ดูแลใหม่และฟื้นโปรเจกต์ขึ้นมานั้นยอดเยี่ยมจริง ๆ โดยเฉพาะขอขอบคุณเป็นพิเศษต่อ @stedolan, @itchyny, @owenthereal ตามชื่อผู้ใช้ GitHub
jq กับ miller เป็นของจำเป็นในกล่องเครื่องมือของผม ร่วมกับ awk และ vim
https://github.com/johnkerl/miller
ฟังก์ชัน built-in ใหม่
pick(stream)เพิ่มความสามารถในการส่งออก projection ของออบเจ็กต์หรืออาร์เรย์อินพุตjq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'ฟีเจอร์นี้ช่วยชีวิตจริง ๆ ขอบคุณผู้ร่วมพัฒนา
$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'{"a": 1,"e": 4}pickที่ทำงานกับ ข้อมูลแบบสตรีมมิง ได้ด้วยอยากแนะนำ jaq ด้วย เป็นโคลนของ jq ที่เน้นความถูกต้อง ความเร็ว และความเรียบง่าย
แม้จะ implements แค่ส่วนย่อยของ jq แต่เท่าที่ใช้มาก็ค่อนข้างพอใจ: https://github.com/01mf02/jaq