Powershell, чтобы соответствовать текущей строке и следующей строке, затем вне файла - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь извлечь данные, в результате чего:

строка 1 = идентификатор отчета + строка 2 = "номер машины" + строка 3 = OFFLINE

Затем Out-File в новый файл.

Пример данных

Report ID           page1

Machine no  1234    

        OTHERS
            12
        offline
            12
        OTHERS
            23
        offline
            37
        OTHERS
            89
        offline
            65

Результат, который я ищу, после обработки выглядит примерно так:

Report ID           page 4

    Machine no  1234    
        offline
            12
        offline
            37
        offline
            65

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать командлет Select-String с параметром -Context для поиска в файле, а затем выбрать, сколько строк контекстной информации вы хотите получить в результате поиска.

Например, если мы возьмем ваш входной файл и сохраним его в переменной с именем $input, например, так:

$inputFile= Get-Content C:\Path\To\YourFile.txt
$inputFile| Select-string 'machine no'
>Machine no  1234  

Затем мы можем найти совпадения для фразы «offline» следующим образом:

$inputFile| Select-String offline -Context 0,1

Это означает, что я хочу, чтобы вы искали слово «офлайн» и дали мне ноль строк после него и одну строку после него, давая нам такой вывод:

>         offline
              12
>         offline
              37
>         offline
              65

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

$out= ''
$out += $inputFile| Select-string 'machine no'
$out += "`n"
$out += $inputFile| Select-String offline -Context 0,1 | ForEach-Object {$_.Context.DisplayPostContext}

#Resulting file would look this, just the name of the machine and then the number of each offline...uh, whatever it is.
    Machine no  1234    
        12             37             65

На вашем месте я бы адаптировал этот поток для создания объектов и свойств PowerShell, например:

$Report = [pscustomobject]@{ID='';MachineNo='';OfflineMembers=@()}
$Report.ID = ($inputFile | select-string page -Context 0 ).ToString().Split('page')[-1]
$Report.MachineNo = ($inputFile | Select-string 'machine no').ToString().Trim().Split()[-1]
$Report.OfflineMembers = $inputFile | Select-String offline -Context 0,1 | ForEach-Object {
            [pscustomobject]@{Value='Offline';ID=$_.Context.DisplayPostContext.Trim()}
            }

>$Report

ID MachineNo OfflineMembers                                                             
-- --------- --------------                                                             
1 1234      {@{Value=Offline; ID=12}, @{Value=Offline; ID=37}, @{Value=Offline; ID=65}}
 $Report.OfflineMembers
Value   ID
-----   --
Offline 12
Offline 37
Offline 65
...