繁体   English   中英

使用 JQ 从 json 日志文件中获取日期

[英]Get dates from json log file using JQ

我有一个这种格式的大文件:

{
  "Name": "Alex",
  "Id": 1,
  "time": "2022-01-01T04:29:18.9099882Z"
}
{
  "Name": "Homer",
  "Id": 2,
  "time": "2022-01-02T04:29:18.9099882Z"
}
{
  "Name": "Bart",
  "Id": 3,
  "time": "2022-01-03T04:29:18.9099882Z"
}

如何按日期范围和特定时间段过滤此文件? 我试图使用 jq 解决这个问题,但无法这样做。 如果有另一种方法如何在没有 jq 的情况下过滤它,请告诉我。

一个简单的select不做你想做的事吗? 例如,使用纯字符串比较使简单的日期范围包含在左侧和排除在右侧:

jq 'select(.time > "2022-01-01" and .time < "2022-01-03")'
{
  "Name": "Alex",
  "Id": 1,
  "time": "2022-01-01T04:29:18.9099882Z"
}
{
  "Name": "Homer",
  "Id": 2,
  "time": "2022-01-02T04:29:18.9099882Z"
}

演示

您还可以使用fromdate将日期字符串转换为例如Unix 时间(“自纪元以来的秒数”)并将其作为数字进行操作(在使用sub截断秒小数以获得ISO 8601兼容日期之后):

jq 'select(.time | sub("\\.\\d+"; "") | fromdate < 1641100000)'
{
  "Name": "Alex",
  "Id": 1,
  "time": "2022-01-01T04:29:18.9099882Z"
}
{
  "Name": "Homer",
  "Id": 2,
  "time": "2022-01-02T04:29:18.9099882Z"
}

演示

或者,为了另一个示例,使用strptime将日期转换为分解数组(按此顺序包含:年、(从零开始)月、日、小时、分钟、秒、星期几和天年)然后过滤例如星期一(在(从零开始的)position 6处的该数组中表示为1 ):

jq 'select(.time | sub("\\.\\d+"; "") | strptime("%FT%TZ") | .[6] == 1)'
{
  "Name": "Bart",
  "Id": 3,
  "time": "2022-01-03T04:29:18.9099882Z"
}

演示

一个 powershell 示例。 将输入作为数组:

[{
  "Name": "Alex",
  "Id": 1,
  "time": "2022-01-01T04:29:18.9099882Z"
},
{
  "Name": "Homer",
  "Id": 2,
  "time": "2022-01-02T04:29:18.9099882Z"
},
{
  "Name": "Bart",
  "Id": 3,
  "time": "2022-01-03T04:29:18.9099882Z"
}]

由于某些原因在 powershell 5 中,我先使用括号完成转换(可能会占用大量内存)。 将时间字段转换为.Net [datetime] 类型,然后很容易进行比较。 如果可以,比较的右侧会自动转换为日期时间。

(get-content file.json | convertfrom-json) | 
foreach-object { $_.time = [datetime]$_.time; $_ } | 
where-object { $_.time -ge '1/1/22' -and $_.time -le '1/2/22' }

Name  Id time
----  -- ----
Homer  2 1/1/2022 11:29:18 PM

这是连续 json 对象的原始文件的解决方法:

get-content file.json -ReadCount 5 | 
foreach-object { $_ | convertfrom-json } | 
foreach-object { $_.time = [datetime]$_.time; $_ } | 
where-object { $_.time -ge '1/1/22' -and $_.time -le '1/2/22' }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM