Полезный ответ Брюса Пайетта показывает, как объединить аспект соответствия через регулярное выражение с токеном извлечение , используя -replace
operator.
Чтобы предложить альтернативу, которая позволяет Select-String
выполнить сопоставление и затем обработать полученные строки с помощью -split
:
Get-Content 'C:\Users\xyz\Downloads\mylog.log' |
Select-String 'string\.string1\.string2 - Request:' |
ForEach-Object { (-split $_)[1,2,6,7,9,10,12,13] -join ' ' }
-split
разбивает каждую совпадающую строку (предоставляется через ForEach-Object
как $_
) на массив токенов по пробелам.
[1,2,6,7,9,10,12,13]
затем извлекает токены с индексом 1
, 2
, ... в виде массива ...
..., элементы которого -join ' '
объединяются, образуя разделенный пробелами список.
Как в стороне: обратите внимание, как .
символов.в шаблоне, переданном в Select-String
, экранируются как \.
, чтобы гарантировать, что они рассматриваются как литерал .
символов, а не как метасимвол регулярного выражения .
, что соответствует любому символу.
При вводе пробы приведенные выше значения:
2018-06-01 06:03:01,855 QWERTY- 123 abc- XX1343XX123-01 Type- BB
2018-06-01 11:06:54,551 QWERTY- 123 abc- XX-12573XX123-00 Type- BB
2018-06-01 11:51:50,124 QWERTY- 123 abc- 123XX122233-03 Type- BB
2018-06-01 12:20:15,076 QWERTY- 123 abc- XX-12563XX123-00 Type- BB
2018-06-01 12:24:25,233 QWERTY- 123 abc- XX-123XX12913-00 Type- BB
Примечание. В отличие от вашего вопроса,вывод включает число, следующее за ,
во втором токене;например, 06:03:01,855
, а не просто 06:03:01,
.Если вы действительно хотите отбросить деталь после ,
, требуется больше работы.
По неизвестным причинам использование операторов -split
и -join
не работает для OP, поэтому вотвариант решения, который использует почти эквивалентные методы .NET напрямую:
Get-Content 'C:\Users\xyz\Downloads\mylog.log' |
Select-String 'string\.string1\.string2 - Request:' |
ForEach-Object { [string]::Join(' ', ([regex]::split($_, '\s+')[1,2,6,7,9,10,12,13])) }