使用jq

时间:2018-05-21 01:27:28

标签: json shell grouping jq

是否有任何智能方法可以使用jq从每个主要节点版本中获取最新版本?或者我是否必须编写另一个包装器shell脚本来处理其输出?

我想得到的(有三个主要版本:v8,v9和v10)最新版本:

v10.1.0
v9.11.1
v8.11.2

发布清单:

$ export repo='nodejs/node'
$ curl -s https://api.github.com/repos/${repo}/tags |jq -r ".[].name"
v10.1.0
v10.0.0
v9.11.1
v9.11.0
v9.10.1
v9.10.0
v9.9.0
v9.8.0
v9.7.1
v9.7.0
v9.6.1
v9.6.0
v9.5.0
v9.4.0
v9.3.0
v9.2.1
v9.2.0
v9.1.0
v9.0.0
v8.11.2
v8.11.1
v8.11.0
v8.10.0
v8.9.4
v8.9.3
v8.9.2
v8.9.1
v8.9.0
v8.8.1
v8.8.0

2 个答案:

答案 0 :(得分:2)

你可以管道这个awk命令:

awk -F. '!major[$1]++'

它使用句点作为字段分隔符,并打印从未见过第一个字段的每一行,这是主要版本。

如果输入未排序且您具有GNU排序,则可以使用其版本排序:

sort -rV | awk -F. '!major[$1]++'

其中-V用于"版本排序"并且-r用于"反向"。

答案 1 :(得分:1)

如果使用以下过滤器将curl的输出传递到jq -r,则应该获得主要版本,而不管卷曲结果中的版本号如何排序:

map(.name)
| map(split(".") | map(tonumber? // .) )
| group_by(.[0])
| map(sort)
| map( .[-1] | map(tostring) | join("."))
| .[]

变异

如果您想要对输出进行排序,只需事先删除“v”,然后再将其粘贴。为了通用性,让我们定义一个函数,它将为每个主要版本输出最新的版本标记:

# Input: an array of "x.y.z..." strings, 
# some or all components of which may be integers
# Output: a stream of the latest "major" releases
def majors:
  map( split(".") | map(tonumber? // .))
  | group_by(.[0])
  | map(sort[-1])[]
  | map(tostring)
  | join(".") ;

map( .name[1:] ) | "v" + majors

打字稿

$ jq -rf major-version.jq input.json
v8.11.2
v9.11.1
v10.1.0