将对象收集到数组中不起作用

collecting objects into array doesn't work

我有一个 JSON 个对象的输入文件(来自应用程序的日志文件):

{ 
  "Url": "http://bla-bla/method1",
  "ReturnCode": 200,
  ...
}
{ 
  "Url": "http://bla-bla/method2",
  "ReturnCode": 500,
  ...
}

等等

我通过jq中的一些转换(例如select、正则表达式函数等)来操纵它,最后我塑造了最终的对象

| { UserName, Url, Duration }

但是我想将这个流收集(正如 jq 所说的那样)到一个数组中,以便 group_by。我看到的所有示例都以数组开头,然后有 | [.[] | { UserName, Url, Duration }],这是可行的。但是,如果我只指定 [{ UserName, Url, Duration }],我不会得到一个数组;相反我得到

[
  { 
  "UserName": "John",
  "Url": "http://bla-bla/method1",
  "Duration ": 10
  }
]
[
  { 
  "UserName": "Bob",
  "Url": "http://bla-bla/method2",
  "Duration": 15
  }
]

没有任何意义!

注意 - 我知道我可以使用 jq "my rules" | jq -s 并且它有效。但是应该有一种方法可以在规则本身内部创建一个数组!

当您从对象流开始时,您可以使用 --slurp(或 -s)标志将对象作为数组成员读入(您不必使用另一个调用,只需以 jq -s '<your filter, maybe using a map>') 开头,或将 inputs--null-input(或 -n)标志结合使用,这样可以更灵活地构造数组:jq -n '[inputs] | …' 甚至 jq -n '[inputs | …]',具体取决于您的实际处理流程。

jq 中的所有内容都是过滤器。即使像 1 这样无害的值也是一个过滤器:它会忽略其输入并生成数字 1 作为输出。

[...] 也是一个过滤器。对于输入中的每个值,它将封闭的过滤器应用于该值并将输出收集到一个数组中。

这意味着创建单个数组作为输出的唯一方法是将单个值作为输入。如果 jq 的输入是一个值流,jq '[...] 将产生一个输出流。为了将值流转换为单个数组,您需要先使用 -s 选项。