Использование Select-String для сопоставления нескольких однострочных шаблонов и записи в вывод - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь создать простой сценарий для использования регулярных выражений и сопоставления нескольких шаблонов в одной строке - рекурсивно по всему входному файлу и записи результата в выходной файл.Но я бью стену:

Пример текста:

BMC12345 COMBINED PHASE STATISTICS:  31 ROWS SELECTED FOR SPACE 'KDDT111D.DIH0345S', 0 ROWS SELECTED BUT DISCARDED DUE TBMC123456 COMBINED PHASE STATISTICS:  10 PHYSICAL (10 LOGICAL) RECORDS DISCARDED TO SYSDISC

Вот что у меня получилось:

$table = [regex] "'.*'"
$discard = [regex] "\d* PHYSICAL"

Select-String -Pattern ($table, $discard) -AllMatches .\test.txt | foreach {
    $_.Matches.Value
} > output.txt

Вывод:

'KDDT111D.DIH0345S'

Желаемый вывод:

'KDDT111D.DIH0345S' 10 Physical

По какой-то причине я не могу получить оба шаблона для записи в вывод.текст.В идеале, когда я получу эту работу, я бы хотел использовать Export-Csv, чтобы получить что-то более чистое, например:

|KDDT111D|DIH0345S|10 Physical|

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Вы столкнулись с ограничением Select-String : свойство .Matches объектов [Microsoft.PowerShell.Commands.MatchInfo], которые Select-String испускает для каждого входного объекта (строки) только когда-либосодержит (потенциально несколько) совпадений для первого регулярного выражения, переданного параметру
-Pattern. [1]

Вы можете обойтипроблема , передав вместо нее одиночное регулярное выражение, комбинируя входные регулярные выражения с помощью альтернирования (|):

Select-String -Pattern ($table, $discard -join '|') -AllMatches .\test.txt | 
  ForEach-Object { $_.Matches.Value } > output.txt

Упрощенный пример:

# ('f.', '.z' -join '|') -> 'f.|.z'
'foo bar baz' | Select-String -AllMatches ('f.', '.z' -join '|') |
  ForEach-Object { $_.Matches.Value }

Выше приведено:

fo
az

, подтверждающее, что были получены совпадения для обоих регулярных выражений.

Caveat re порядок вывода : Использование чередования (|) приводит к тому, что о совпадениях для данной входной строки сообщается в том порядке, в котором они найдены на входе , а не впорядок, в котором были заданы регулярные выражения .
То есть и -Pattern 'f.|.z' и -Pattern '.z|f.', приведенные выше, привели бы к одному и тому же порядку вывода.


[1] Проблема существует в Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.4 и обсуждается в этой проблеме GitHub

0 голосов
/ 05 февраля 2019

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

Я обнаружил, что оператор -match возвратил только первое вхождение соответствия шаблону регулярного выражения из исходного файла, поэтому мне нужно было добавитьцикл foreach для рекурсивного возврата совпадений по всему файлу журнала.

Я также изменил регулярное выражение, включив в него только значения сброса, превышающие 0.

Образец текста:

BMC51472I COMBINED PHASE STATISTICS:  0 ROWS SELECTED FOR SPACE 'KDDT000D.KDAICH0S', 0 ROWS SELECTED BUT DISCARDED DUE TOBMC51479I COMBINED PHASE STATISTICS:  0 PHYSICAL (0 LOGICAL) RECORDS DISCARDED TO SYSDISC
BMC51472I COMBINED PHASE STATISTICS:  3499604 ROWS SELECTED FOR SPACE 'KDDT000D.KDAIND0S', 0 ROWS SELECTED BUT DISCARDED BMC51479I COMBINED PHASE STATISTICS:  0 PHYSICAL (0 LOGICAL) RECORDS DISCARDED TO SYSDISC
BMC51472I COMBINED PHASE STATISTICS:  1 ROWS SELECTED FOR SPACE 'KDDT000D.KDCISR0S', 0 ROWS SELECTED BUT DISCARDED DUE TOBMC51479I COMBINED PHASE STATISTICS:  0 PHYSICAL (0 LOGICAL) RECORDS DISCARDED TO SYSDISC
BMC51472I COMBINED PHASE STATISTICS:  9185775 ROWS SELECTED FOR SPACE 'KDDT000D.KDIADR0S', 0 ROWS SELECTED BUT DISCARDED BMC51479I COMBINED PHASE STATISTICS:  11 PHYSICAL (11 LOGICAL) RECORDS DISCARDED TO SYSDISC
BMC51472I COMBINED PHASE STATISTICS:  0 ROWS SELECTED FOR SPACE 'KDDT000D.KDICHT0S', 0 ROWS SELECTED BUT DISCARDED DUE TOBMC51479I COMBINED PHASE STATISTICS:  0 PHYSICAL (0 LOGICAL) RECORDS DISCARDED TO SYSDISC
BMC51472I COMBINED PHASE STATISTICS:  2387375 ROWS SELECTED FOR SPACE 'KDDT000D.KDICMS0S', 0 ROWS SELECTED BUT DISCARDED BMC51479I COMBINED PHASE STATISTICS:  0 PHYSICAL (0 LOGICAL) RECORDS DISCARDED TO SYSDISC
BMC51472I COMBINED PHASE STATISTICS:  1632821 ROWS SELECTED FOR SPACE 'KDDT000D.KDIPRV0S', 0 ROWS SELECTED BUT DISCARDED BMC51479I COMBINED PHASE STATISTICS:  0 PHYSICAL (0 LOGICAL) RECORDS DISCARDED TO SYSDISC
BMC51472I COMBINED PHASE STATISTICS:  0 ROWS SELECTED FOR SPACE 'KDDT000D.KDLADD0S', 0 ROWS SELECTED BUT DISCARDED DUE TOBMC51479I COMBINED PHASE STATISTICS:  24845 PHYSICAL (24845 LOGICAL) RECORDS DISCARDED TO SYSDISC

Пример:

  $regex = ".+SPACE '(?<Space>.+)\.(?<SubSpace>.+)'.+: (?<Discarded>.+) .[1-9][0-9]*\s\b"

    $timestamp = Get-Date
    $timestamp = Get-Date $timestamp -f "MM_dd_yy"
    $dir = "C:\Users\JonMonJovi\"

    cat $dir\*.log.txt | where {
        $_ -match $regex
    } | foreach {
        $Matches.Space, $Matches.SubSpace, $Matches.Discarded -join "|"
    } > C:\Users\JonMonJovi\Discarded\Discard_Log_$timestamp.txt

Выход:

KDDT000D|KDIADR0S| 11 PHYSICAL
KDDT000D|KDLADD0S| 24845 PHYSICAL

Отсюда я могуиспользуйте выходной файл .txt с разделителями для импорта в Excel, выполняя мои требования.

0 голосов
/ 01 февраля 2019

Я думаю, вы найдете оператор -match немного более подходящим для этого.[ ухмылка ] с использованием именованных совпадений с вашим образцом, хранящимся в $InStuff, это ...

$InStuff -match ".+SPACE '(?<Space>.+)\.(?<SubSpace>.+)'.+: (?<Discarded>.+) \(.+"

... дает следующий набор совпадений ...

Name                           Value                                                                              
----                           -----                                                                              
Space                          KDDT111D                                                                           
SubSpace                       DIH0345S                                                                           
Discarded                      10 PHYSICAL                                                                        
0                              BMC12345 COMBINED PHASE STATISTICS: 31 ROWS SELECTED FOR SPACE 'KDDT111D.DIH0345...

именованные совпадения могут быть адресованы $Matches.<the capture group name>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...