0

我不是正则表达式专家。我试图了解是否可以使用 RegEx 从 JSON 文件中查找数据块。

我的场景:

我正在使用具有增强监控功能的 AWS RDS 实例。监控数据正在发送到 CloudWatch 日志流。我正在尝试使用在 CloudWatch 中发布的数据在日志管理解决方案 Loggly 中可见。

摄取没问题,可以在Loggly中看到数据。但是,整个消息都包含在一个大的 blob 字段中。字段内容是一个 JSON 文档。我想弄清楚是否可以使用 RegEx 仅提取 JSON 文档的某些部分。

这是我正在使用的 JSON 有效负载的示例提取:

{
    "engine": "MySQL",
    "instanceID": "rds-mysql-test",
    "instanceResourceID": "db-XXXXXXXXXXXXXXXXXXXXXXXXX",
    "timestamp": "2017-02-13T09:49:50Z",
    "version": 1,
    "uptime": "0:05:36",
    "numVCPUs": 1,
    "cpuUtilization": {
        "guest": 0,
        "irq": 0.02,
        "system": 1.02,
        "wait": 7.52,
        "idle": 87.04,
        "user": 1.91,
        "total": 12.96,
        "steal": 2.42,
        "nice": 0.07
    },
    "loadAverageMinute": {
        "fifteen": 0.12,
        "five": 0.26,
        "one": 0.27
    },
    "memory": {
        "writeback": 0,
        "hugePagesFree": 0,
        "hugePagesRsvd": 0,
        "hugePagesSurp": 0,
        "cached": 505160,
        "hugePagesSize": 2048,
        "free": 2830972,
        "hugePagesTotal": 0,
        "inactive": 363904,
        "pageTables": 3652,
        "dirty": 64,
        "mapped": 26572,
        "active": 539432,
        "total": 3842628,
        "slab": 34020,
        "buffers": 16512
    },

我的问题

我的问题是,我可以使用 RegEx 提取文档的一个子集吗?例如,CPU 利用率或内存等?如果可能的话,我该如何编写正则表达式?如果可能的话,我可以使用它深入到提取的文档中以获取单个数据元素。

非常感谢您的帮助。

4

1 回答 1

0

首先,我同意 Sebastian 的观点:合适的 JSON 解析器更好。

无论如何,有时必须使用肮脏的方法。如果您的文本布局不会改变,那么正则表达式很简单:

例如"total": (\d+\.\d+)获取 CPU 使用率和"total": (\d\d\d+)总内存使用率(匹配至少 3 位数字与第一个总文本不匹配,内存可能永远不会少于 100 :-)。

如果预期会发生变化,请使其更加稳定:["']total["']\s*:\s*(\d+\.\d+).

也可以像这样匹配返回字符:"cpuUtilization"\s*:\s*\{\s*\n.*\n\s*"irq"\s*:\s*(\d+\.\d+)使其更加稳定(这次是 irq 值)。

等等等等。

你会发现你可以快速进入非常复杂的表达式。这种方法非常脆弱!

PS 根据 loggy 正则表达式的确切细节,细节可能会发生变化。以上示例基于 Perl。

于 2017-02-16T18:34:52.027 回答