Как использовать CloudWatch Insights Regex, чтобы не возвращаться после первого матча, но возвращать коллекцию - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть много строк в моих журналах CloudWatch, которые являются JSON объектами, подобными этому:

{
    "friends": [
        { "name": "bob"},
        { "name": "steve"},
        { "name": "joe" }
    ]
}

Используя выражения регулярных выражений CloudWatch, я хотел бы извлечь все имена. У меня уже есть регулярное выражение, которое возвращает значения, которые я хочу:

/"name":[ ]*"([^"]*)"/g

Как вы видите, работает по этой ссылке: https://regex101.com/r/Bb28Pg/2

Использование CloudWatch грамматика, это регулярное выражение становится этой командой:

fields @message
| filter @message like /"friends":/
| parse @message /"name":[ ]*"(?<@name>[^"]*)"/

Но это выражение возвращает только первое имя, "bob" в примере. Я хочу получить их всех. Я попытался добавить /g в конце выражения, но это не помогло. Я пытаюсь найти какую-то информацию в официальных документах https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html, но я не смог найти ничего, связанного с этой темой.

Есть похожий вопрос по этому поводу в Cloudwatch Поиск Insights в многострочных журналах , но он не использует команду анализа и также не имеет ответа.

1 Ответ

0 голосов
/ 26 февраля 2020

Для ограниченного и хорошо известного числа дочерних узлов я мог бы найти очень уродливый способ сделать это:

fileds @message
| filter @message like /"friends":/
| parse @message /"name":[ ]*"(?<@name1>[^"]*)"/
| parse @message /"name"(?:(?!"name")(.|\n))+]*"name":[ ]*"([?<@name2>^"]*)/
| parse @message /"name"(?:(?!"name")(.|\n))+]*"name"(?:(?!"name")(.|\n))+]*"name":[ ]*"(?<@name3>[^"]*)/ 

По сути, он говорит: ищите ключевое слово name, затем продолжайте искать все, что не является ключевым словом name, затем извлеките все между кавычками после второго ключевого слова name. По аналогии с @name3, но теперь, прыгая по ключевым словам. Вы можете играть с этим регулярным выражением по этой ссылке https://regex101.com/r/Bb28Pg/3.

Приложив немного дополнительных усилий, можно объединить их всех в огромное регулярное выражение.

Это не то решение, которое я искал. Но это может быть полезно кому-то.

...