Извлечение некоторых полей из AWS JSON с помощью Powershell - PullRequest
0 голосов
/ 01 июня 2018

Теперь, когда Powershell является открытым исходным кодом и кроссплатформенным (с Powershell Core), я решил попробовать еще раз.

Я использовал в прошлом и в какой-то момент понял, как работают конвейеры, но это не супер интуитивно понятно.Так и должно быть, но это не так, поэтому я несколько застрял ...

Задача под рукой: проанализировать и распечатать несколько полей из вывода JSON команды.Я мог бы, вероятно, сделать это старомодным способом, с внешними командами и обработкой строк, а-ля bash, но я хочу научиться делать это способ Powershell ™.

И чтобы уточнить, я хочу сделать это в интерактивном режиме, в конвейере. Я не хочу писать сценарий, я хочу узнать, как выполнять этот вид обработки в одной строке (или 2, максимум, но в основном с Powershell, работающим как REPL, а не как инструмент скрипта).

Команда Bash:

aws cloudformation describe-stack-events --stack-name some-stack-here | jq ".StackEvents[] | [.Timestamp, .ResourceStatus, .ResourceType, .ResourceStatusReason] | join(\" \")"

Для этого нужно взять входной JSON и напечатать всего 3 поля, которые меня интересуют.

ВводJSON:

{
    "StackEvents": [
        {
            "StackId": "arn:aws:cloudformation:some-region-here:some-number-here:stack/some-stack-here/some-id-here",
            "EventId": "some-event-id-here",
            "ResourceStatus": "UPDATE_COMPLETE",
            "ResourceType": "AWS::CloudFormation::Stack",
            "Timestamp": "some-date-here",
            "StackName": "some-stack-here",
            "PhysicalResourceId": "arn:aws:cloudformation:some-region-here:some-number-here:stack/some-stack-here/some-id-here",
            "LogicalResourceId": "some-stack-here"
        },
        {
            "StackId": "arn:aws:cloudformation:some-region-here:some-number-here:stack/some-stack-here/some-id-here",
            "EventId": "some-event-id-here",
            "ResourceStatus": "UPDATE_COMPLETE_CLEANUP_IN_PROGRESS",
            "ResourceType": "AWS::CloudFormation::Stack",
            "Timestamp": "some-date-here",
            "StackName": "some-stack-here",
            "PhysicalResourceId": "arn:aws:cloudformation:some-region-here:some-number-here:stack/some-stack-here/some-id-here",
            "LogicalResourceId": "some-stack-here"
        }
    ]
}

Вывод команды:

"some-date-here  UPDATE_COMPLETE  AWS::CloudFormation::Stack  "
"some-date-here  UPDATE_COMPLETE_CLEANUP_IN_PROGRESS  AWS::CloudFormation::Stack  "

(Я думаю, что это должно быть на Stackoverflow, потому что тема подразумевает довольно глубокое понимание концепций Powershell, включая объекты .NET, гораздо ближев программировании, чем в системном администрировании, т.е. SuperUser или около того.)

1 Ответ

0 голосов
/ 01 июня 2018

Вы можете сделать:

$j = aws cloudformation describe-stack-events --stack-name some-stack-here | ConvertFrom-Json
$j.StackEvents | % { "{0} {1} {2}" -f $_.Timestamp, $_.Resourcestatus, $_.ResourceType }

Используйте командлет ConvertFrom-Json, чтобы сохранить результат команды в объект powershell, затем вы можете выбрать массив StackEvents и выполнить цикл для выбора необходимых значений.

Если вы хотите сделать это в одну строку:

(aws cloudformation describe-stack-events --stack-name some-stack-here | ConvertFrom-Json).StackEvents | %
{ "{0} {1} {2}" -f $_.Timestamp, $_.Resourcestatus, $_.ResourceType }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...