Поиск в логе 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
}