[英]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.