【问题标题】:why is awk pattern match not returning results?为什么 awk 模式匹配不返回结果?
【发布时间】:2019-04-29 18:24:24
【问题描述】:

使用以下 1 行创建一个文件 (x):

{"dagId":"blashj","execDate":"20190426","status":"running","isActive":true}

--> 返回想要的值 ---> true

cat x | sed -e 's/[{}"]/''/g' | awk -v RS=',' -F: '/^\isActive/ {print $0}'

--> 为什么这没有返回值??期望值--->运行

cat x | sed -e 's/[{}"]/''/g' | awk -v RS=',' -F: '/^\status/ {print $0}'

env 是 RHEL7.4,GNU Awk 4.0.2

【问题讨论】:

  • 为什么不用jq来解析json数据呢?
  • 请将该示例输入的所需输出添加到您的问题中。
  • 为什么要转义正则表达式中的 is 字符?

标签: linux bash shell unix awk


【解决方案1】:

那会是因为\s 不匹配?

【讨论】:

  • 我的理解是 /^\isActive/ 会寻找以 isActive 开头的行,然后返回,那么其他模式有什么不同?
  • /^\status/ 表示“查找以空格 (\s) 开头的行,后跟字符串 tatus。”参考文献the guide 获取转义序列列表。
  • 它在 RHEL5 机器上正常工作,但在 RHEL7 上的行为必须改变
  • \s 作为匹配空白的转义序列是 gawk 特有的。可能您之前运行的是非 gnu awk,其中 \s 将匹配 s,但在您的新系统中,您使用的是 gnu awk。您可以添加--traditional,如果它开始工作,您就会知道原因。见gnu.org/software/gawk/manual/html_node/…
  • @tooptoop4 我觉得你错过了真正的重点——不要那样做!如果您不希望 s 表示 [:space:] 时只是不转义它,那么您不必担心正在执行的 awk 版本或传递它的标志。如果您想在正则表达式中使用字符s,那么只需写s,而不是\s。 wrt /^\isActive/ will look for line starting with isActive - 嗯,是的,但/^isActive/ 也是如此,因为\ii 的含义相同(除非有人想出一个awk 版本或标记某天\i 具有特殊含义!)跨度>
【解决方案2】:

如果您像我一样在工作中无法访问jq,我会使用正则表达式作为awk 记录分隔符。

$ awk -F: -v RS='[{},]' '/"isActive"/{print $2}' x
true

$ awk -F: -v RS='[{},]' '/"status"/{print $2}' x
"running"

【讨论】:

    【解决方案3】:

    我会全心全意地支持jq,它应该可以在您的平台上使用:

    jq -r '"isActive:"+(.isActive | tostring)' file
    

    如果你只需要一个对象属性的值,它可以很简单

    jq -r '.status'  file
    

    -r--raw-output 将字符串直接写入标准输出,而不是格式化为带引号的 JSON 字符串

    jq is sed for json。使用正确的工具可以节省时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多