Вывод запроса синтаксического анализа - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь проанализировать выходные данные запроса API остальных в форме

$response = Invoke-RestMethod -Uri $uri -Headers $headers
$response.name | Select-String -Pattern ^role

возвращает вывод, аналогичный приведенному ниже (элементы, разделенные ::)

role::servicing2
role::collaboration::lei
role::commercial_lines::npds
role::nvp::windows::ucce_gold
role::oracle::linux::oracle_oid
role::splunk::splunk_enterprise::add_on

Мне нужно читать эти выходные данные построчно и анализировать.

If there are just 2 elements eg. role::servicing2 ignore the line
If there are 3 elements, ignore the first element "role", prepend puppet_ to the second element and it becomes the project, the third element is the role (OS is unknown)
If there are 4 or more elements, ignore the first element "role", prepend puppet_ to the second element and it becomes the project, if the third element is "windows" or "linux" that is the OS, else OS is "unknown", and the last element \:\:'(\w+)'$ is the role.

Нужен вывод в виде массива или таблицы или списка в этом формате (необязательно нужен заголовок)

Project         OS      Role

puppet_collaboration    unknown     lei
puppet_commercial_lines unknown     npds
puppet_nvp      windows     ucce_gold
puppet_oracle       linux       oracle_oid
puppet_splunk       unknown     add_on

Я пробовал различные выражения регулярных выражений.Не удалось выяснить логику обхода этой строки за строкой и соответствующего анализа в списке или массиве.

1 Ответ

2 голосов
/ 27 сентября 2019

Я думаю, что следующий код должен делать то, что вы хотите:

$roles = @'
role::servicing2
role::collaboration::lei
role::commercial_lines::npds
role::nvp::windows::ucce_gold
role::oracle::linux::oracle_oid
role::splunk::splunk_enterprise::add_on
'@ -split '\r?\n'

$result = $roles | ForEach-Object {
    $parts = $_ -split '::'
    switch ($parts.Count) {
        2 { continue }  # ignore this line
        3 { 
            [PsCustomObject]@{
                'Project' = 'puppet_{0}' -f $parts[1]
                'OS'      = 'unknown'
                'Role'    = $parts[2]
            }
        }
        default {
            [PsCustomObject]@{
                'Project' = 'puppet_{0}' -f $parts[1]
                'OS'      = if ('windows', 'linux' -contains $parts[2]) {$parts[2]} else {'unknown'}
                'Role'    = $parts[-1]
            }        
        }
    }
}

# output on screen
$result

# output to CSV file
$result | Export-Csv -Path 'D:\roles.csv' -NoTypeInformation

Для тестирования я поместил результат вашего $response.name | Select-String -Pattern ^role в строку здесь.

Вывод:

Project                 OS      Role      
-------                 --      ----      
puppet_collaboration    unknown lei       
puppet_commercial_lines unknown npds      
puppet_nvp              windows ucce_gold 
puppet_oracle           linux   oracle_oid
puppet_splunk           unknown add_on
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...