jq实用入门(及更多)

2020-12-22 04:44:10

2020年12月21日发布jq是用于解析和修改JSON的命令行工具。这对于从输出JSON的工具或返回JSON的REST API中提取相关的信息位很有用。 Mac用户可以使用自制软件来安装jq(brew install jq);有关更多安装选项,请参见此处。

在这篇文章中,我们将研究一对夫妇的真实世界。使用jq的示例,但让我们从...开始

{:" duchess&#34 ;,:" Toronto&#34 ;,::[{:" x&#34 ;,:10},{:" y&#34 ;,: 15}]}

我非常喜欢这种漂亮的打印/格式化功能,我有一个别名可以格式化已复制的JSON(在我的OS" clipboard"中)并且把它放回我的剪贴板中:

'。'在jq'。'中上面的命令是最简单的jq" filter。该点接受输入的JSON并按原样输出。您可以在此处阅读有关过滤器的更多信息,但最基本的了解是.keyname会将结果过滤到与该键匹配的属性,而[index]将与该索引处的数组值匹配:

$ echo $ USERX | jq' .name' " duchess" $ echo $ USERX | jq' .orders [0]' {" id&#34 ;:" x&#34 ;," qty&#34 ;: 10}

按值过滤输出也很方便!在这里我们使用|将一个过滤器的结果输出到另一个过滤器的输入中,然后选择(.qty> 10)仅选择qty值大于10的订单:

$ ORDER =' {" user_id":123," user_name":" duchess"," order_id":456,&# 34; order_status":" sent",vendor_id":789," vendor_name":" Abe Books"}' $ echo $ ORDER | jq'。' {123,user_name&#34 ;:"公爵夫人&#34 ;," order_id&#34 ;: 456 ," order_status&#34 ;:" sent&#34 ;、" vendor_id&#34 ;: 789," vendor_name&#34 ;:" Abe Books"} $ echo $ ORDER | jq' with_entries(select(.key | match(" order _")))' {" order_id&#34 ;: 456," order_status&#34 ;: "发送"}

task_name值是文件名的事实是一个危险信号-具有高基数的标签很不好,而且我不确定其中有多少个标签。我想找出:

在我公司,有一个CLI工具,我们将调用pquery,该工具允许从命令行查询prometheus度量标准,并且它输出JSON,这是多么方便!在以下示例中,我将使用此工具。您没有此工具,但不要担心:这篇精彩的文章解释了如何使用curl查询普罗米修斯,这实际上是pquery的工作。

使用pquery,我们可以查看来自各个集群的Prometheus指标。但是,即使我们过滤了这个确切的指标名称,它的数据也比我们容易看到的更多。我们将使用wc -l(wordcount:计数行)来大致了解我们正在处理的数据量:

316,117行JSON!钱币!我们要遍历指标。但是,我们需要什么jq过滤器来访问指标数组?我发现对于确定大型json结构的顶级键是有用的:

$ pquery' async_task_total' |头-n 20 {" data&#34 ;: {" result&#34 ;: [{" metric&#34 ;: {" __ name __&#34 ;:" async_task_total& #34 ;、" app&#34 ;:" toodle-app-alpha&#34 ;、" instance&#34 ;:" 10.55.55.55:9393&#34 ;、&# 34; job":" toodle-app-alpha"," kubernetes_pod_name":" toodle-app-b446b7ccd-6mls6","命名空间&# 34 ;:" noweb&#34 ;," netpol&#34 ;:" toodle-app&#34 ;," node_name&#34 ;:" gke-production-04 -3455c6df-j526&#34 ;," release&#34 ;:" toodle-app&#34 ;," task_name&#34 ;:" / charmoffensive / toodle-app / pkg / core / user / user.go(67):GetAccountDetails" }," value&#34 ;: [1600981630.344," 2"

无论如何,我们可以从上方看到.data.result是" filter"指标本身的路径。让我们获取此数组的第一个结果([0]),以便我们可以看到一个度量标准:

$ pquery' async_task_total' | jq' .data.result [0]' {" metric&#34 ;: {" __ name __&#34 ;:" async_task_total&#34 ;," app& #34 ;:" toodle-app-alpha"," instance&#34 ;:" 10.55.55.55:9393&#34 ;、" job&#34 ;:&# 34; toodle-app-alpha&#34 ;," kubernetes_pod_name&#34 ;:" toodle-app-b446b7ccd-6mls6&#34 ;," namespace&#34 ;:" noweb&# 34;,netpol":" toodle-app"," node_name":" gke-production-04-3455c6df-j526",& #34; release&#34 ;:" toodle-app&#34 ;," task_name&#34 ;:" /charmoffensive/toodle-app/pkg/core/user/user.go(67 ):GetAccountDetails" }," value&#34 ;: [1600981906.069," 2" ]}

糟糕!该应用程序的值(sodle-app-alpha)表示一个错误:我只对sodled-app应用程序的结果感兴趣,而对可能发出此指标的其他应用程序不感兴趣(例如,我们在此处看到的alpha部署) 。我们可以使用jq进行选择,但是promql已经允许我们按指标名称进行过滤,因此我们将改为:pquery' async_task_total {app =" toodle-app"}&#39 ;。

我们对度量对象中的task_name值感兴趣,因此,请从上面数组中的每个项目中得出以下结论:

该标签的一万八千个值!不好!!但是请稍候-如果其他标签有所不同,则其中一些实际上可能是重复的。让我们对它们进行排序,然后查看:

现在,我已经获得了该标签所有不同值的完整列表,可以回答我的第一个问题。

九十二!还不错谜团解决了,我可以放心地说"这些标签的基数不是很高,我就别说了。

$ kubectl获取部署toodle-app -o json \ | jq' .status.conditions [] |(.reason +&#34 ;:" + .message)' -rNewReplicaSetAvailable:ReplicaSet" toodle-app-545b65cfd4" MinimumReplicasAvailable:部署具有最低可用性。

$ kubectl获取服务toodle-app -o json \ | jq&#39.metadata.annotations | with_entries(select(.key | match(" prometheus"))))' {" prometheus.io/path" ;:" / varz&#34 ;,&# 34; prometheus.io/port" ;:" 9393&#34 ;," prometheus.io/scrape" ;:" true"}

$ cat cronjob.yamlapiVersion:batch / v1beta1kind:CronJobspec:schedule:" * / 1 * * * *" #每分钟一次jobTemplate:规格:模板:规格:容器:-名称:部署扫描器图像:部署扫描器:38 $ brew install yq $ yq' .spec.jobTemplate.spec.template.spec.containers [ 0] .image' cronjob.yaml" deployment-scanner:38"

每次在应用配置之前(当我在本地开发kubernetes cronjob时),每次在cronjob.yaml中增加图像值时,我都会使用它来构建新的docker图像标签:

➜curl -sL https://postmates.com/feed | pup'< title> postmates:送餐,杂货,酒精-随处可见< / title>➜curl -sL pup' head meta [charset]< meta charset =" UTF-8"> curl -sL https://postmates.com/feed | pup' head meta [charset] json {}' [{" charset&#34 ;:" UTF-8&#34 ;," tag&#34 ;:&# 34; meta" }]

您将jq或yq用于什么?您会在工作流程中添加小狗吗?在评论中听起来很响,就是说“给我下一行!”

📝评论?请通过电子邮件将它们发送到我的protonmail.com地址,用户名sequoiam