匹配大括号之间的字符串,如果包含模式

时间:2021-01-11 13:53:01

标签: json regex awk grep

在日志中,我想匹配所有类型为“sync.out.notify.job.status”的 json 对象并打印它们。我使用的是 Mac (zsh)。

我试过:grep -Eo \{.+"sync\.out\.notify\.job\.status".+\}

Mon Jan 11 2021 13:08:46 GMT+0100 (Central European Standard Time) CoreSyncNotifications: sync.out.notify.job.status:
{
  "cloudid": "00000000-0000-0000-0000-000000000000",
  "job": "files",
  "majorstate": "syncing",
  "minorstate": "transferring",
  "requestid": "45768456-bd58-4cb5-9dff-dfgjfgdj456",
  "type": "sync.out.notify.job.status",
  "userid": "XXXXXXXXXXXXXXXXXXXXXXXX@AdobeID",
  "version": "1.1.43711"
}
Mon Jan 11 2021 13:08:46 GMT+0100 (Central European Standard Time) Vulcan: <- COSY 4.3: sync.out.notify.job.status
Mon Jan 11 2021 13:08:46 GMT+0100 (Central European Standard Time) CoreSyncNotifications: sync.out.notify.job.status:
{
  "errors": "",
  "cloudid": "00000000-0000-0000-0000-000000000000",
  "job": "files",
  "majorstate": "idle",
  "minorstate": "complete",
  "requestid": "4856658fdgh-efb3-4da9-b5f5-4856658fgj",
  "type": "sync.out.notify.job.status",
  "userid": "XXXXXXXXXXXXXXXXXXXXXXXX@AdobeID",
  "version": "1.1.43711"
}
Mon Jan 11 2021 13:08:46 GMT+0100 (Central European Standard Time) WebSocketServer: client_7: SEND syncstate creative_cloud: ok

2 个答案:

答案 0 :(得分:2)

grep 通常只在单行中搜索模式,除非您在 -z 中使用 gnu grep 选项。

你可以试试这个 gnu awk 命令:

awk -v RS='(^|\n){[^}]+?sync.out.notify.job.status[^}]+}(\n|$)' 'RT {printf "%s", RT}' file

{
  "cloudid": "00000000-0000-0000-0000-000000000000",
  "job": "files",
  "majorstate": "syncing",
  "minorstate": "transferring",
  "requestid": "45768456-bd58-4cb5-9dff-dfgjfgdj456",
  "type": "sync.out.notify.job.status",
  "userid": "XXXXXXXXXXXXXXXXXXXXXXXX@AdobeID",
  "version": "1.1.43711"
}

{
  "errors": "",
  "cloudid": "00000000-0000-0000-0000-000000000000",
  "job": "files",
  "majorstate": "idle",
  "minorstate": "complete",
  "requestid": "4856658fdgh-efb3-4da9-b5f5-4856658fgj",
  "type": "sync.out.notify.job.status",
  "userid": "XXXXXXXXXXXXXXXXXXXXXXXX@AdobeID",
  "version": "1.1.43711"
}

答案 1 :(得分:2)

假设您想打印匹配的块,您可以轻松、稳健地使用像 jq 这样的 JSON 感知工具:

$ grep -v '^[[:alpha:]]' file | jq 'select(.type=="sync.out.notify.job.status")'
{
  "cloudid": "00000000-0000-0000-0000-000000000000",
  "job": "files",
  "majorstate": "syncing",
  "minorstate": "transferring",
  "requestid": "45768456-bd58-4cb5-9dff-dfgjfgdj456",
  "type": "sync.out.notify.job.status",
  "userid": "XXXXXXXXXXXXXXXXXXXXXXXX@AdobeID",
  "version": "1.1.43711"
}
{
  "errors": "",
  "cloudid": "00000000-0000-0000-0000-000000000000",
  "job": "files",
  "majorstate": "idle",
  "minorstate": "complete",
  "requestid": "4856658fdgh-efb3-4da9-b5f5-4856658fgj",
  "type": "sync.out.notify.job.status",
  "userid": "XXXXXXXXXXXXXXXXXXXXXXXX@AdobeID",
  "version": "1.1.43711"
}

这是从 { 到 } 到管道到 jq 的另一种方法:

$ sed -n '/^{/,/^}/p' file
{
  "cloudid": "00000000-0000-0000-0000-000000000000",
  "job": "files",
  "majorstate": "syncing",
  "minorstate": "transferring",
  "requestid": "45768456-bd58-4cb5-9dff-dfgjfgdj456",
  "type": "sync.out.notify.job.status",
  "userid": "XXXXXXXXXXXXXXXXXXXXXXXX@AdobeID",
  "version": "1.1.43711"
}
{
  "errors": "",
  "cloudid": "00000000-0000-0000-0000-000000000000",
  "job": "files",
  "majorstate": "idle",
  "minorstate": "complete",
  "requestid": "4856658fdgh-efb3-4da9-b5f5-4856658fgj",
  "type": "sync.out.notify.job.status",
  "userid": "XXXXXXXXXXXXXXXXXXXXXXXX@AdobeID",
  "version": "1.1.43711"
}

我通常不建议使用范围表达式而不是使用标志,但在这种情况下,因为这就是您要做的所有事情,所以可能没问题。

相关问题