首页 > 解决方案 > 从文件中提取不满足特定条件的行

问题描述

在以下文件中,我需要获取其中没有以下模式的所有行:

\"\d\d\d\":[

我不想要这条线 ,"memo": {或者"notice": "delivered on 17",我只想要那些有的线\"\d\d\d\":[,但是他们有\"\d\d\":[,或者\"\s\d\d\":[等等。这怎么能用 sed 或 awk 来完成,或者用 jq 做得更好?

我只需要其中没有\"\d\d\d\":[模式的行,例如\"42 \":[应该报告。每个消息行,必须有\"\d\d\d\":[,而不是任何其他变化。比如\"42a\":[也是错误的,应该报

{
  "memo": {
    "notice": "delivered on 17"
  },
  "message": "{\"id\":\"1\",\"401\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 190"
  },
  "message": "{\"id\":\"2\",\"424\":[[\" 0\",[\"v\",\"UK\"],[\"9\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 734"
  },
  "message": "{\"id\":\"3\",\"432\":[[\" 0\",[\"a\",\"UK\"],[\"9\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"v\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 1092"
  },
  "message": "{\"id\":\"888\",\"5 2\":[[\" 0\",[\"v\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}

作为输出,我需要有这些问题的行的 id 值。

以上的预期输出:id: 888因为在这一行中存在错误\"5 2\":[

标签: bashawksedjq

解决方案


解码所有messages,选择不包含任何key匹配的s \d{3},提取它们id的s。

jq '.message | fromjson | select(any(keys_unsorted[]; test("[0-9]{3}")) | not) .id' file

推荐阅读