Разбор данных из файла журнала с использованием шаблонов Regex - PullRequest
2 голосов
/ 11 марта 2020

У меня есть файл журнала, полный журналов этого типа:

2020-02-04 04:00:31,503 [z4y6480f-214b-4253-9223-n02542f706ac] [INFO] [ServiceType] [ObjectType] - Information about the log

Я хотел бы, используя шаблоны регулярных выражений, получить время, последний текст в скобках ([ObjectType] в примере) и информационное сообщение после дефиса.

Пример ввода:

2020-02-04 04:00:33,435 [z4y6480f-214b-4253-9223-n02542f706ac] [INFO] [ServiceTypeJohn] [ObjectTypeJohn] - Information about the John log
2020-02-04 06:50:34,465 [z4y6480f-214b-4253-9223-n02542f706ac] [INFO] [ServiceTypeBob] [ObjectTypeBob] - Information about the Bob log
2020-02-04 07:20:34,677 [z4y6480f-214b-4253-9223-n02542f706ac] [INFO] [ServiceTypeSam] [ObjectTypeSam] - Information about the Sam log

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

04:00:33,435 [ObjectTypeJohn] - Information about the John log
06:50:34,465 [ObjectTypeBob] - Information about the Bob log
07:20:34,677 [ObjectTypeSam] - Information about the Sam log

До сих пор я пробовал это, но не удалось :

(Get-Content Output.txt) -replace '^(\d\d:\d\d:\d\d).*(\[.*?\] - .*?)$','$1;$2'

Буду признателен за любую помощь в этом, спасибо.

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

В качестве альтернативы решению регулярного выражения рассмотрим использование унарной формы оператора -split , что делает концептуально более простое решение:

(Get-Content Output.txt).ForEach({ 
  # Split line into an array of fields by whitespace.
  $fields = -split $_ 
  # Extract the fields of interest by index and re-join with spaces.
  $fields[1, 5 + 6..($fields.Count-1)] -join ' ' 
})

Унарная форма -split ведет себя подобно утилите Unix awk в том, что она разбивает строку на строки при любых запусках непустых пробелов, игнорируя начальные и конечные пробелы).

Обратите внимание, что решение, приведенное выше, полагается на в полях перед -, не содержащих сами пробелы, что верно для примера ввода.

2 голосов
/ 11 марта 2020

Вы можете использовать

(Get-Content Output.txt) -replace '^\S+\s+(\S+).*(\[[^][]*])\s*(-.*)', '$1 $2 $3'

См. . NET regex demo

Подробности

  • ^ - начало строки
  • \S+ - 1+ символов, кроме пробелов
  • \s+ - 1+ пробелов
  • (\S+) - группа 1 : 1+ символов, кроме пробелов
  • .* - любые 0+ символов, кроме новой строки, как можно больше
  • (\[[^][]*]) - группа 2: [, 0+ символов других чем [ и ], а затем ] char
  • \s* - 1+ пробелов
  • (-.*) - группа 3: - и остальная часть строки .

Результаты демонстрации:

enter image description here

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