代码之家  ›  专栏  ›  技术社区  ›  Bill

使用jq获取每个主要节点版本的最新版本

  •  2
  • Bill  · 技术社区  · 6 年前

    有什么聪明的方法可以从每个主要节点版本中 jq ?或者我需要编写另一个包装外壳脚本来处理它的输出?

    我想得到的(有三个主要版本: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 回复  |  直到 6 年前
        1
  •  1
  •   peak    6 年前

    如果把curl的输出输入 jq -r 使用下面的过滤器,无论curl结果中版本号的排序方式如何,您都应该获得主要版本:

    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
    
        2
  •  2
  •   Benjamin W.    6 年前

    您可以通过管道发送到此awk命令:

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

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

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

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

    哪里 -V 用于“版本排序”和 -r 表示“反向”。