如何使用jq从JSON中提取URL列表?
问题描述
Microsoft Clarity 返回JSON格式数据,我已通过jq提取出以下JSON片段:
$ echo $JSON | jq '.[] | select(.metricName == "PopularPages") | .[]' "PopularPages" [ { "url": "https://www.mslinn.com/blog/2023/09/14/boost.html", "visitsCount": "8" }, { "url": "https://www.mslinn.com/blog/2021/02/11/javascript-named-arguments.html", "visitsCount": "8" }, { "url": "https://www.mslinn.com/blog/2023/08/20/pytest.html", "visitsCount": "7" }, { "url": "https://www.mslinn.com/blog/2022/01/10/wsl-backup.html", "visitsCount": "7" }, { "url": "https://www.mslinn.com/av_studio/640-music21.html", "visitsCount": "5" }, { "url": "https://www.mslinn.com/llm/4000-wsl.html", "visitsCount": "4" }, { "url": "https://www.mslinn.com/blog/2021/04/28/buildah-podman.html", "visitsCount": "4" }, { "url": "https://www.mslinn.com/blog/2020/10/27/installing-a-new-ssh-key-on-awc-ec2-with-user-data.html", "visitsCount": "3" }, { "url": "https://www.mslinn.com/av_studio/570-ableton-push-standalone.html", "visitsCount": "3" }, { "url": "https://www.mslinn.com/git/600-partial-clone.html", "visitsCount": "3" } ]
但我无法将上述JSON精简为每行一个的url值列表,预期效果如下:
https://www.mslinn.com/blog/2023/09/14/boost.html https://www.mslinn.com/blog/2021/02/11/javascript-named-arguments.html https://www.mslinn.com/blog/2023/08/20/pytest.html https://www.mslinn.com/blog/2022/01/10/wsl-backup.html https://www.mslinn.com/av_studio/640-music21.html https://www.mslinn.com/llm/4000-wsl.html https://www.mslinn.com/blog/2021/04/28/buildah-podman.html https://www.mslinn.com/blog/2020/10/27/installing-a-new-ssh-key-on-awc-ec2-with-user-data.html https://www.mslinn.com/av_studio/570-ableton-push-standalone.html https://www.mslinn.com/git/600-partial-clone.html
原始JSON的结构如下:
[ ... { "metricName": "PopularPages", "information": [ { "url": "https://www.mslinn.com/blog/2023/09/14/boost.html", "visitsCount": "8" }, { "url": "https://www.mslinn.com/blog/2021/02/11/javascript-named-arguments.html", "visitsCount": "8" }, { "url": "https://www.mslinn.com/blog/2023/08/20/pytest.html", "visitsCount": "7" }, { "url": "https://www.mslinn.com/blog/2022/01/10/wsl-backup.html", "visitsCount": "7" }, { "url": "https://www.mslinn.com/av_studio/640-music21.html", "visitsCount": "5" }, { "url": "https://www.mslinn.com/llm/4000-wsl.html", "visitsCount": "4" }, { "url": "https://www.mslinn.com/blog/2021/04/28/buildah-podman.html", "visitsCount": "4" }, { "url": "https://www.mslinn.com/blog/2020/10/27/installing-a-new-ssh-key-on-awc-ec2-with-user-data.html", "visitsCount": "3" }, { "url": "https://www.mslinn.com/av_studio/570-ableton-push-standalone.html", "visitsCount": "3" }, { "url": "https://www.mslinn.com/git/600-partial-clone.html", "visitsCount": "3" } ] } ]
请问应使用何种jq命令实现该需求?
解决方案
直接针对原始JSON结构,使用以下jq命令即可提取每行一个的URL列表:
echo $JSON | jq -r '.[] | select(.metricName == "PopularPages") | .information[].url'
命令说明:
-r:输出原始字符串,不带JSON格式的引号.[]:遍历顶层数组中的每个元素select(.metricName == "PopularPages"):筛选出metricName字段值为PopularPages的对象.information[].url:遍历目标对象的information数组,逐个提取每个子对象的url字段值
如果是基于你已经提取出的JSON片段(包含"PopularPages"字符串和页面数组的结果),可以用以下命令处理:
echo $YOUR_EXTRACTED_JSON | jq -r '.[1][] | .url'
你的提取结果是一个包含两个元素的数组:第一个是字符串"PopularPages",第二个是页面对象数组,所以用.[1]定位到页面数组,再遍历每个对象提取url。
内容的提问来源于stack exchange,提问作者Mike Slinn
相关产品推荐
相关产品推荐

