【问题标题】:Jq select conditionjq 选择条件
【发布时间】:2019-12-12 03:22:54
【问题描述】:

我有一个日志文件,想从中grep数据,所以我使用Jq通过参数过滤一些数据。

如上所述,我将根据传递给 Jq 的参数过滤数据

详情:

我的日志文件结构:

 {
    city: "",
    phone_number: "",
    address: "",
    zip_code: "",
    person : {
        name: "",
        sex: "",
        ...
    }
 }

我的预期是我想忽略用于过滤的属性是empty 还是null。

例如:

cat my_log_file.log | jq -r --arg city ${city} --arg name ${name}  'select(.city == $city and .person.name == $name)'

使用上面的命令,如果我传递的${city} 参数是empty 或null,那么我想用 city 删除过滤器,只用 name 过滤

试过了还是不行

【问题讨论】:

  • empty 不是 JSON 值。你的意思是空字符串"",还是空对象{},或者两者兼而有之?如果您遵循minimal reproducible example 指南,将会很有帮助!
  • @peak empty 是 ""。谢谢回复!

标签: json select command-line-arguments jq


【解决方案1】:

要检查一个值,比如 $value,是 null 还是 "",可以这样写:

$value == null or $value == ""

所以你可以通过使用这个 jq 程序来实现你想要的:

def agrees(value): 
  value == null or value == "" or . == value;

select( (.city | agrees($city)) and
        (.person.name | agrees($name)) )

【讨论】:

    【解决方案2】:

    ...如果属性为空或为空,我想忽略属性

    要从对象中删除不需要的键,您可以将其传递给过滤器,例如:

    with_entries(select(.value | (. != "" and . != {} and . != null)))
    

    【讨论】:

    • 就我而言,如果传递给它们的参数是empty,我想忽略用于过滤的属性。抱歉,我的问题让您感到困惑
    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多