在日志中,我想匹配所有类型为“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
答案 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"
}
我通常不建议使用范围表达式而不是使用标志,但在这种情况下,因为这就是您要做的所有事情,所以可能没问题。