【问题标题】:JQ: Filter result by does not contain string OR is less than valueJQ:过滤结果不包含字符串或小于值
【发布时间】:2018-03-11 22:35:57
【问题描述】:

在 Ubuntu 上,我有

jq '.[] | {addr: .addr, subver: .subver, inbound: .inbound, synced_blocks: .synced_blocks} | select(.synced_blocks < 77982)'

{
  "addr": "299.247.7.254:8268",
  "subver": "/String:0.22.5.7/",
  "inbound": false,
  "synced_blocks": 77979
}
{
  "addr": "228.290.206.224:8268",
  "subver": "/String:0.22.5.6/",
  "inbound": false,
  "synced_blocks": 77980
}
{
  "addr": "208.62.262.244:55226",
  "subver": "/String:0.22.5.7/",
  "inbound": true,
  "synced_blocks": 77978
}
{
  "addr": "200.2.222.25:50452",
  "subver": "/String:0.22.5.7/",
  "inbound": true,
  "synced_blocks": 77980
}
{
  "addr": "220.92.79.44:50970",
  "subver": "/String:0.22.4.2/",
  "inbound": true,
  "synced_blocks": -2
}
{
  "addr": "45.22.228.69:57462",
  "subver": "/String:0.22.5.7/",
  "inbound": true,
  "synced_blocks": 77980
}
{
  "addr": "29.206.256.229:8268",
  "subver": "/String:0.22.5.7/",
  "inbound": false,
  "synced_blocks": 77980
}

还有

select(.subver | contains("0.22.5.7") | not)

用于显示 subver 不包含“0.22.5.7”的结果。但我不能同时满足这两种情况。

如何仅显示 subver 不包含“0.22.5.7”或 .synced_blocks

【问题讨论】:

  • 如果您能更准确地(用英文?)指定“不包含”的含义,那将会很有帮助。 (我没有否决这个问题,但这是我最关心的问题!)
  • 是 /String:0.22.4.2/ 中的“0.22.5.7”

标签: json select jq


【解决方案1】:

这里主要的不明显的事情是后缀“不”:

select( ( .subver | test("(^|:)0.22.5.7($|/)") | not) or
        .synced_blocks < 77982)

【讨论】:

  • 或者您是否建议测试 bc 是一项成本较低的操作?
  • 您没有具体说明“包含”的含义,但我怀疑它是否符合 contains 的语义,这可能不是您认为的那样。正如建议的解决方案所示,test 支持正则表达式。
猜你喜欢
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2017-08-02
相关资源
最近更新 更多