2017-02-16 2 views
0

Я не эксперт RegEx. Я пытаюсь понять, могу ли использовать RegEx для поиска блока данных из файла JSON.Как я могу использовать RegEx для извлечения данных в документе JSON

Мой Сценарий:

Я использую экземпляр AWS RDS с улучшенным мониторингом. Данные мониторинга отправляются в поток журнала CloudWatch. Я пытаюсь использовать данные, опубликованные в CloudWatch, для видимости в Log Log.

Проглатывание не представляет проблемы, я могу видеть данные в 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? Если возможно, я могу использовать его для углубления в извлеченный документ, чтобы получить отдельные элементы данных.

Большое спасибо за помощь.

+1

Если доступен парсер JSON, вы должны предпочесть его для ручного анализа с помощью регулярного выражения. –

ответ

0

Сначала я согласен с Себастьяном: правильный JSON-парсер лучше.

В любом случае иногда используется грязный подход. Если ваш текст не изменится, то регулярное выражение просто:

E.g. "total": (\d+\.\d+) получает использование ЦП и "total": (\d\d\d+) общее использование памяти (совпадение не менее 3 цифр не соответствует первому полному тексту, память, вероятно, никогда не будет меньше 100 :-).

Если ожидается, что изменения будут немного более стабильными: ["']total["']\s*:\s*(\d+\.\d+).

Возможно также совпадение с возвращаемыми символами: "cpuUtilization"\s*:\s*\{\s*\n.*\n\s*"irq"\s*:\s*(\d+\.\d+) делает его более стабильным (на этот раз значение irq).

И так далее и так далее.

Вы видите, что вы можете быстро перейти в очень сложные выражения. Этот подход очень хрупок!

P.S. В зависимости от точных деталей регулярного выражения журнала детали могут измениться. Вышеприведенные примеры основаны на Perl.

+0

Большое спасибо, Дирк. Я проверю это! – sadeq68

Смежные вопросы