从文件中提取不满足某些条件的行

时间:2020-03-18 09:17:12

标签: bash awk sed jq

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

\"\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\":[

2 个答案:

答案 0 :(得分:2)

对所有message进行解码,选择不包含任何与键\d{3}匹配的密钥,然后提取其id

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

答案 1 :(得分:0)

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

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

awk '$0 ~ /\\"\\d\\d\\d\\":\[/ {next;}{print;}' test.txt | awk '$0 ~ /memo/ {next;}{print;}' | awk '$0 ~ /notice/ {next;}{print;}'

{ }, “ message”:“ {\” id \“:\” 1 \“,\” 401 \“:[[\” 0 \“,[\” a \“,\” UK \“],[\” b \“,\” Euy / O \“],[\” c \“,\” 20160811 \“],[\” g \“,\” R2 \“]],[\” 1 \“,[\” a \“,\”英国\“],[\” b \“,\” LO \“],[\” c \“,\” 20160811 \“]]]}}” } { }, “ message”:“ {\” id \“:\” 2 \“,\” 424 \“:[[\” 0 \“,[\” v \“,\”英国\“],[\” 9 \“,\” Euy / O \“],[\” c \“,\” 20160811 \“],[\” g \“,\” R2 \“]],[\” 1 \“,[\” a \“,\”英国\“],[\” b \“,\” LO \“],[\” c \“,\” 20160811 \“]]]}}” } { }, “ message”:“ {\” id \“:\” 3 \“,\” 432 \“:[[\” 0 \“,[\” a \“,\” UK \“],[\” 9 \“,\” Euy / O \“],[\” c \“,\” 20160811 \“],[\” v \“,\” R2 \“]],[\” 1 \“,[\” a \“,\”英国\“],[\” b \“,\” LO \“],[\” c \“,\” 20160811 \“]]]}}” } { }, “ message”:“ {\” id \“:\” 888 \“,\” 532 \“:[[\” 0 \“,[\” v \“,\” UK \“],[\” b \“,\” Euy / O \“],[\” c \“,\” 20160811 \“],[\” g \“,\” R2 \“]],[\” 1 \“,[\” a \“,\”英国\“],[\” b \“,\” LO \“],[\” c \“,\” 20160811 \“]]]}}” }

也许您仍然需要清理一些括号。