Поиск в логе powershell

Я пытаюсь использовать PowerShell для поиска в журнале определенной строки, а затем использовать определенный раздел строки, которая имеет эту строку.

Строки журнала, которые меня интересуют, выглядят примерно так:

2019-02-25 11: 51: 37.394 field1 = data | field2 = data | field3 = data | field4 = data | field5 = data

Я могу получить возврат этих строк просто отлично - но тогда мне нужно извлечь данные из одного из этих полей, чтобы использовать их для другого поиска. Я застрял там. Как извлечь данные из определенного "поля" (поля, разделенные | и данные, отделенные от имени поля =)?

$dir = "path\to\workingdir"
$file = "logfilename"
$str2 = "eventType=59"

$out = (Get-Content $dir\$file | Select-String -Pattern $str2 |out-string)

Мне нужно извлечь и использовать данные в поле 3 для другого поиска в журнале. Все, что я пробовал, похоже, возвращает все, что я получаю в $out. Я не могу заставить "split" или "indexof" работать должным образом (вообще).... хотя я даже не уверен, что это то, что я должен пытаться использовать.

2 ответа

Решение

Как только у вас есть строка с полями в ней, вы можете использовать .Split() метод, чтобы захватить предметы. что-то вроде этого...

'field1=data1|field2=data2|field3=data3|field4=data4|field5=data5'.Split('|')[2].Split('=')[1]

... даст вам это...

data3

Прежде всего вы захотите отделить ваше сообщение журнала от отметки времени:

$line = '2019-02-25 11:51:37.394 field1=data|field2=data|field3=data|...'
$date, $time, $msg = $line.Split(' ', 3)

например, вот так, когда вы обрабатываете файл журнала:

Get-Content "${dir}\${file}" | ForEach-Object {
    $date, $time, $msg = $_.Split(' ', 3)
    # ...
}

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

$msg.Split('|') | ForEach-Object {
    $name, $value = $_.Split('=', 2)
}

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

$data = @{}
$msg.Split('|') | ForEach-Object {
    $name, $value = $_.Split('=', 2)
    $data[$name] = $value
}

а затем использовать эту хеш-таблицу для дальнейшей обработки, например

if ($data['eventType'] -eq '59') {
    # do some
} else {
    # do other
}
Другие вопросы по тегам