Я ищу тонну журналов, используя цикл foreach для строки ($ text) и в настоящее время выводю всю строку в выходной файл ($ logfile)

Get-ChildItem "\\$server\$Path" -Filter "*.log" |select-string -pattern $text |select -expandproperty line |out-file $logfile -append

Примерная строка одного из файлов журнала может выглядеть так

May 25 04:08:36.640 2016 AUDITOF GUID 1312.2657.11075.54819.13021094807.198 opened by USER

Где $text = "opened by USER"

Все это отлично работает и выводит каждую строку каждого файла журнала, который включает $ text, и это здорово.

Но ... я думаю, что хотел бы получить вывод даты, времени и GUID. Guid может изменять форматы, длину и т. Д., Но он всегда будет иметь точки и всегда будет следовать за GUID (space) и предшествовать (space) opened

Короче говоря, я пытаюсь использовать регулярное выражение, используя lookbehind (или lookforward) или сопоставление, которое вернет что-то подобное в файл $ logfile

25 мая, 04:08: 36.640 2016,1312.2657.11075.54819.13021094807.198

Любая помощь приветствуется. Мне плохо с Regex.

0
dbutts 12 Фев 2021 в 16:24

1 ответ

Лучший ответ

Один из способов - это сделать

$result = Get-ChildItem "\\$server\$Path" -Filter "*.log" -File | 
          Select-String -Pattern $text -SimpleMatch |
          Select-Object -ExpandProperty Line |
          ForEach-Object {
              if ($_ -match '([a-z]{3,}\s*\d{2}\s*\d{2}:\d{2}:\d{2}\.\d{3}\s*\d{4}).*GUID ([\d.]+)') {
                  '{0},{1}' -f $matches[1], $matches[2]
              }
          }

$result | Out-File $logfile -Append 

Пояснение:

  • Я добавил переключатель -SimpleMatch в командлет Select-String, потому что кажется, что вы хотите точно сопоставить $text, и поскольку он не использует там регулярное выражение, это был бы лучший вариант.
  • Select-Object -ExpandProperty Line может вернуть массив совпадающих строк, поэтому я передаю его в ForEach-Object, чтобы выполнить цикл, хотя этот
  • if (..) использует регулярное выражение -match, и если это условие равно $ true, мы делаем все, что находится внутри фигурных скобок.
    Кроме того, этот тест (если $ true) автоматически устанавливает массив объектов $ match, и мы используем эти совпадения для вывода строки, разделенной запятыми, которая затем сохраняется в переменной $ result.
  • Наконец, мы просто выводим этот $ result в файл

Детали регулярного выражения:

(               Match the regular expression below and capture its match into backreference number 1
   [a-z]        Match a single character in the range between “a” and “z”
      {3,}      Between 3 and unlimited times, as many times as possible, giving back as needed (greedy)
   \s           Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
      *         Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   \d           Match a single digit 0..9
      {2}       Exactly 2 times
   \s           Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
      *         Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   \d           Match a single digit 0..9
      {2}       Exactly 2 times
   :            Match the character “:” literally
   \d           Match a single digit 0..9
      {2}       Exactly 2 times
   :            Match the character “:” literally
   \d           Match a single digit 0..9
      {2}       Exactly 2 times
   \.           Match the character “.” literally
   \d           Match a single digit 0..9
      {3}       Exactly 3 times
   \s           Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
      *         Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   \d           Match a single digit 0..9
      {4}       Exactly 4 times
)
.               Match any single character that is not a line break character
   *            Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
GUID\           Match the characters “GUID ” literally
(               Match the regular expression below and capture its match into backreference number 2
   [\d.]        Match a single character present in the list below
                A single digit 0..9
                The character “.”
      +         Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
2
Theo 12 Фев 2021 в 14:03