首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jq转换日期值,然后通过它进行筛选。

使用jq转换日期值,然后通过它进行筛选。
EN

Stack Overflow用户
提问于 2021-09-09 10:32:26
回答 1查看 287关注 0票数 0

我有一些数据采用以下格式:

代码语言:javascript
复制
[
  {
    "level": "error",
    "ts": "2021-09-08T17:34:39.163Z",
    "caller": "controller/events.go:39",
    "msg": "Metric query failed for p50 Latency: request failed: Get \"https://blah\": context deadline exceeded",
    "canary": "blah",
    "stacktrace": "github.com/fluxcd/flagger/pkg/controller.(*Controller).recordEventErrorf\n\t/workspace/pkg/controller/events.go:39\ngithub.com/fluxcd/flagger/pkg/controller.(*Controller).runMetricChecks\n\t/workspace/pkg/controller/scheduler_metrics.go:280\ngithub.com/fluxcd/flagger/pkg/controller.(*Controller).runAnalysis\n\t/workspace/pkg/controller/scheduler.go:682\ngithub.com/fluxcd/flagger/pkg/controller.(*Controller).advanceCanary\n\t/workspace/pkg/controller/scheduler.go:380\ngithub.com/fluxcd/flagger/pkg/controller.CanaryJob.Start.func1\n\t/workspace/pkg/controller/job.go:39"
  },
  {
    "level": "error",
    "ts": "2021-09-09T11:22:33.162Z",
    "caller": "controller/events.go:39",
    "msg": "Metric query failed for p50 Latency: request failed: Get \"https://blah\": context deadline exceeded",
    "canary": "blah",
    "stacktrace": "github.com/fluxcd/flagger/pkg/controller.(*Controller).recordEventErrorf\n\t/workspace/pkg/controller/events.go:39\ngithub.com/fluxcd/flagger/pkg/controller.(*Controller).runMetricChecks\n\t/workspace/pkg/controller/scheduler_metrics.go:280\ngithub.com/fluxcd/flagger/pkg/controller.(*Controller).runAnalysis\n\t/workspace/pkg/controller/scheduler.go:682\ngithub.com/fluxcd/flagger/pkg/controller.(*Controller).advanceCanary\n\t/workspace/pkg/controller/scheduler.go:380\ngithub.com/fluxcd/flagger/pkg/controller.CanaryJob.Start.func1\n\t/workspace/pkg/controller/job.go:39"
  }
]

我试图按日期过滤这些数据,例如,我希望在某个日期之后找到所有这些事件。时间戳1631122500应该在这里筛选出顶部条目(使用ts == 2021-09-08T17:34:39.163Z)。

如果我应用命令| jq -s '.[] | select(.ts | fromdateiso8601 > 1475625600)',它将返回错误jq: error (at <stdin>:8): date "2021-08-30T21:52:34.039Z" does not match format "%Y-%m-%dT%H:%M:%SZ"

我通过应用以下修改来修改ts字段:jq -s '.[].ts | split(".")[0] | strptime("%Y-%m-%dT%H:%M:%S") | mktime | strftime("%Y-%m-%dT%H:%M:%SZ")'。这将返回像"2021-09-08T18:34:39Z"这样的值,这是在前面的错误中指定的格式。

我无法理解的是如何将这些ts值转换为正确的格式,然后使用select从指定的时间开始按日期进行筛选。我尝试将jq <modify>管道传输到| jq <select>,但这给了我一个关于jq无法遍历字符串的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-09 10:45:56

来自OP的评论

这就是为什么我试图应用一个转换,然后按它进行选择。我可以将日期转换为JQ所需的正确值。

在调用select之后,我们就可以通过管道传递.ts值以删除JQ不能像这样解析的纳秒:

代码语言:javascript
复制
jq 'map(select(.ts | (split(".")[0] + "Z") | fromdateiso8601 > 1631184310))'

上面的时间戳(1631184310)将选择第二个对象,就像选择在这里试一试一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69116628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档