gpt4 book ai didi

powershell - Powershell:从日志文件中提取数据以创建新对象

转载 作者:行者123 更新时间:2023-12-03 01:11:24 31 4
gpt4 key购买 nike

我和powershell一起绊脚石。

我有脚本可以解析数百台PC上的同一日志文件,从而提取出我们感兴趣的两种类型的事务。

此行与模式匹配,将日志的每一行保存在一个包含多行的变量中。我将匹配对象转换为字符串,以便稍后进行拆分。

$strLogEvents = select-string -path \\$Cmpname\c$\ProgramData\IS\Logs\DMS\outlook.* -pattern '(doFolderDocSearch ends, duration)|(doDocSearch ends, duration)' | ForEach-Object {$_.ToString()}

这是$ StrLogEvents对于单个PC的保存方式
\\naimc\c$\ProgramData\IS\Logs\DMS\OUTLOOK.log:325:Wed 08/17 10:24:44.983 PerformanceContext:  59:Info2 [10728] System call doDocSearch ends, duration 60203 ms
\\naimc\c$\ProgramData\IS\Logs\DMS\OUTLOOK.log_bak:886:Fri 08/05 16:23:14.249 PerformanceContext: 59:Info2 [12204] System call DoFolderDocSearch ends, duration 1796 ms
\\naimc\c$\ProgramData\IS\Logs\DMS\OUTLOOK.log_bak:963:Fri 08/05 16:23:27.901 PerformanceContext: 59:Info2 [12204] System call DoFolderDocSearch ends, duration 250 ms
\\naimc\c$\ProgramData\IS\Logs\DMS\OUTLOOK.log_bak:1046:Fri 08/05 16:23:41.625 PerformanceContext: 59:Info2 [12204] System call doDocSearch ends, duration 171 ms
\\naimc\c$\ProgramData\IS\Logs\DMS\OUTLOOK.log_bak:1422:Sun 08/07 23:08:49.107 PerformanceContext: 59:Info2 [12204] System call DoFolderDocSearch ends, duration 250 ms
\\naimc\c$\ProgramData\IS\Logs\DMS\OUTLOOK.log_bak:1786:Sun 08/07 23:09:42.750 PerformanceContext: 59:Info2 [12204] System call doDocSearch ends, duration 407 ms
\\naimc\c$\ProgramData\IS\Logs\DMS\OUTLOOK.log_bak:1847:Sun 08/07 23:10:05.494 PerformanceContext: 59:Info2 [12204] System call doDocSearch ends, duration 454 ms

对于每一行,我仅对重新培训计算机名,日期,时间,系统调用类型,持续时间(以毫秒为单位)感兴趣。

我可以用以下方法进一步分解字符串数组:
$ParsedLogEvents = $strLogEvents | ForEach-Object {$_.split("\, ",[System.StringSplitOptions]::RemoveEmptyEntries)}

$ ParsedLogEvents中的字符串现在对于每个“段”数据都包含一个干净的行

示例:每个项目都在自己的行上。我添加了***来表示我要保留的行。
naimc***-PCName
c$
ProgramData
IS
Logs
DMS
OUTLOOK.log_bak:4602:Mon
08/15*** -Date
14:36:01.667 -Time
PerformanceContext:
59:Info2
[10928]
System
call
doDocSearch ***-EventType
ends
duration
47 ***-Duration
ms
naimc
c$
ProgramData
Osler
IS
Logs
DMS
OUTLOOK.log_bak:4610:Mon
08/15
14:36:01.748
PerformanceContext:
59:Info2
[10928]
System
call
doDocSearch
ends
duration
31
ms

我想我必须将每一行作为单个变量处理。 (无法弄清楚这个简单的部分)。之后,我可以简单地使用$ ParsedLogEvents [lineNumber]返回要保留以创建哈希表或对象的行的记录。这将允许我另存为CSV或导出到SQL datbase。我现在不能执行此操作,因为所有原始事件的每一行都在一个大数组中在一起。

有什么建议么 ?我朝着正确的方向前进吗?

最佳答案

通过正则表达式模式的命名组在Select-String中进行字段解析:

$report = select-string `
-path \\$Cmpname\c$\ProgramData\IS\Logs\DMS\outlook.* `
-pattern ('(?<date>.+? .+?) ' +
'(?<time>.+?) .+? ' +
'(?<syscall>doFolderDocSearch|doDocSearch) ends, duration ' +
'(?<duration>.+?) ms') `
| %{
$g = $_.matches[0].groups
@{
computer = $Cmpname
date = $g['date'].value
time = $g['time'].value
syscall = $g['syscall'].value
duration = $g['duration'].value
}
}

将产生一个对象数组,可通过 $report[1].computer$report[1].date等进行访问:

Name                           Value
---- -----
date Wed 08/17
time 10:24:44.983
syscall doDocSearch
computer naimc
duration 60203

关于powershell - Powershell:从日志文件中提取数据以创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022331/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com