使用Windows cmd或Powershell将多行文本日志转换为CSV
我正在尝试将一个统一的多行日志文件转换为CSV,但没有任何效果。请帮忙!我在Windows服务器上,所以它必须是命令行或Powershell 输入样本:使用Windows cmd或Powershell将多行文本日志转换为CSV,windows,powershell,cmd,Windows,Powershell,Cmd,我正在尝试将一个统一的多行日志文件转换为CSV,但没有任何效果。请帮忙!我在Windows服务器上,所以它必须是命令行或Powershell 输入样本: SERVICE_NAME: BDESVC DISPLAY_NAME: BitLocker Drive Encryption Service BDESVC hosts the BitLocker Drive Encryption service. BitLocker Drive Encryption provides secure startup
SERVICE_NAME: BDESVC
DISPLAY_NAME: BitLocker Drive Encryption Service
BDESVC hosts the BitLocker Drive Encryption service. BitLocker Drive Encryption provides secure startup for the operating system, as well as full volume encryption for OS, fixed or removable volumes. This service allows BitLocker to prompt users for various actions related to their volumes when mounted, and unlocks volumes automatically without user interaction. Additionally, it stores recovery information to Active Directory, if available, and, if necessary, ensures the most recent recovery certificates are used. Stopping or disabling the service would prevent users from leveraging this functionality.
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\WINDOWS\System32\svchost.exe -k netsvcs
LOAD_ORDER_GROUP :
TAG : 0
DEPENDENCIES :
SERVICE_START_NAME: localSystem
FAIL_RESET_PERIOD : 900 seconds
FAILURE_ACTIONS : Restart DELAY: 60000 seconds
: Restart DELAY: 60000 seconds
: None DELAY: 0 seconds
SERVICE_NAME: BFE
DISPLAY_NAME: Base Filtering Engine
The Base Filtering Engine (BFE) is a service that manages firewall and Internet Protocol security (IPsec) policies and implements user mode filtering. Stopping or disabling the BFE service will significantly reduce the security of the system. It will also result in unpredictable behavior in IPsec management and firewall applications.
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\WINDOWS\system32\svchost.exe -k LocalServiceNoNetwork
LOAD_ORDER_GROUP : NetworkProvider
TAG : 0
DEPENDENCIES : RpcSs
SERVICE_START_NAME: NT AUTHORITY\LocalService
FAIL_RESET_PERIOD : 86400 seconds
FAILURE_ACTIONS : Restart DELAY: 120000 seconds
: Restart DELAY: 300000 seconds
: None DELAY: 0 seconds
需要CSV输出(仅显示第一个事件):
这里有一个可能的解决方案。请记住,这会对您的数据做出一些假设,而做这种事情总是有点不切实际:
(Get-Content 'YourFile.log') -Replace '(.*?)\s*:\s*(.*)','$1=$2' -Split '\r\n\r\n' | ForEach-Object {
$Text = ($_ -split '\n') -Replace '\\','\\'
$Text[2] = 'DESCRIPTION='+ $Text[2]
$Result = $Text | Out-String | ConvertFrom-StringData
$Properties = [ordered]@{}
$Headers = 'SERVICE_NAME','DISPLAY_NAME','DESCRIPTION','TYPE','START_TYPE','ERROR_CONTROL','BINARY_PATH_NAME','LOAD_ORDER_GROUP','TAG','DEPENDENCIES','SERVICE_START_NAME','FAIL_RESET_PERIOD','FAILURE_ACTIONS'
$Headers | ForEach-Object { $Properties.Add($_,$Result.$_) }
[PSCustomObject]$Properties
} | Export-CSV 'out.csv' -NoTypeInformation
- 使用正则表达式
将第一个(.*)\s*:\s*(.*)
及其两侧的任何空格字符转换为:
。我们这样做是为了以后可以使用=
cmdlet将数据转换为哈希表对象ConvertFrom-StringData
- 根据有两个(Windows样式)回车的位置拆分数据
,因此我们有一个单独记录的集合\r\n\r\n
- 遍历记录并将文本拆分为单独的行。使用(看起来很混乱的)正则表达式“\\\”、“\\\”将任何单个斜杠替换为两个斜杠。这是为了
不会被文件路径绊倒convertfromstringdata
- 获取数据中的第三行,并将“DESCRIPTION=”添加到此行的开头,否则此行不是预期的name=value格式
- 通过
将结果文本返回到单个字符串对象,然后通过Out string
将其转换为哈希表ConvertFrom StringData
- 由于
按字母顺序重新排列字段,因此创建第二个名为ConvertFrom-StringData
的哈希表,该哈希表使用预定义的标题有序列表,然后从此列表创建PowerShell对象[ordered]
- 将结果导出为CSV
- 这里有一个可能的解决方案。请记住,这会对您的数据做出一些假设,而做这种事情总是有点不切实际:
(Get-Content 'YourFile.log') -Replace '(.*?)\s*:\s*(.*)','$1=$2' -Split '\r\n\r\n' | ForEach-Object {
$Text = ($_ -split '\n') -Replace '\\','\\'
$Text[2] = 'DESCRIPTION='+ $Text[2]
$Result = $Text | Out-String | ConvertFrom-StringData
$Properties = [ordered]@{}
$Headers = 'SERVICE_NAME','DISPLAY_NAME','DESCRIPTION','TYPE','START_TYPE','ERROR_CONTROL','BINARY_PATH_NAME','LOAD_ORDER_GROUP','TAG','DEPENDENCIES','SERVICE_START_NAME','FAIL_RESET_PERIOD','FAILURE_ACTIONS'
$Headers | ForEach-Object { $Properties.Add($_,$Result.$_) }
[PSCustomObject]$Properties
} | Export-CSV 'out.csv' -NoTypeInformation
- 使用正则表达式
将第一个(.*)\s*:\s*(.*)
及其两侧的任何空格字符转换为:
。我们这样做是为了以后可以使用=
cmdlet将数据转换为哈希表对象ConvertFrom-StringData
- 根据有两个(Windows样式)回车的位置拆分数据
,因此我们有一个单独记录的集合\r\n\r\n
- 遍历记录并将文本拆分为单独的行。使用(看起来很混乱的)正则表达式“\\\”、“\\\”将任何单个斜杠替换为两个斜杠。这是为了
不会被文件路径绊倒convertfromstringdata
- 获取数据中的第三行,并将“DESCRIPTION=”添加到此行的开头,否则此行不是预期的name=value格式
- 通过
将结果文本返回到单个字符串对象,然后通过Out string
将其转换为哈希表ConvertFrom StringData
- 由于
按字母顺序重新排列字段,因此创建第二个名为ConvertFrom-StringData
的哈希表,该哈希表使用预定义的标题有序列表,然后从此列表创建PowerShell对象[ordered]
- 将结果导出为CSV
Select String
捕获需要输出的变量,而不是完全按照这两种特定情况的格式进行处理
您可以尝试以下方法:
$myArr = [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=SERVICE_NAME)" -AllMatches | % {$_.Matches} | % {$_.Value}
这将返回所有单个日志条目的数组,前提是SERVICE\u NAME
从每个条目开始。从那里,您可以循环该数组中的每个条目,并查找要输出到CSV的值:
$myArr = @()
[IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { $myArr += `
[PSCustomObject]@{
"Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
"START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
}}
或者,如果您不想将其读入变量,请将其添加到管道末端:
[IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { `
@([PSCustomObject]@{
"Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
"START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
})} | Select-Object -Property Type,Start_Type | Export-Csv -Path C:\temp\test\myout.txt -NoTypeInformation
[IO.File]::ReadAllText(“C:\YourLogFile.txt”)|选择字符串模式“服务名称[\s\s]*?(?=(服务名称)|($)”)“-AllMatches |%{$|.Matches}{$|.Value}}{`
@([PSCustomObject]@{
“Type”=Select String-InputObject$_uu2;Pattern”(?要提供与之不同的视角,您可以尝试使用Select String
捕获需要输出的变量,而不是像这两种特定情况那样使用格式
您可以尝试以下方法:
$myArr = [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=SERVICE_NAME)" -AllMatches | % {$_.Matches} | % {$_.Value}
这将返回一个包含所有单个日志条目的数组,假设服务\u NAME
从每个条目开始。从那里,您可以循环该数组中的每个条目,并查找要输出到CSV的值:
$myArr = @()
[IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { $myArr += `
[PSCustomObject]@{
"Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
"START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
}}
或者,如果您不想将其读入变量,请将其添加到管道末端:
[IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { `
@([PSCustomObject]@{
"Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
"START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE : ).*?(?=\r)" | % {$_.Matches} | % {$_.Value};
})} | Select-Object -Property Type,Start_Type | Export-Csv -Path C:\temp\test\myout.txt -NoTypeInformation
[IO.File]::ReadAllText(“C:\YourLogFile.txt”)|选择字符串模式“服务名称[\s\s]*?(?=(服务名称)|($)”)“-AllMatches |%{$|.Matches}{$|.Value}}{`
@([PSCustomObject]@{
“Type”=选择字符串-InputObject$\模式”(?欢迎使用SO!虽然有很多SO用户可以为您编写脚本,但SO不是一个代码编写服务,而是一个问答论坛。您应该尝试一下,发布代码,并就哪些内容不起作用提出具体问题。^^这是非常正确的,值得以后记住。我已经回答了,但主要是因为这些问题allenges总是激起我的好奇心。希望它能帮助我。欢迎来到SO!虽然有很多SO用户可以为你编写脚本,但SO不是一个代码编写服务,而是一个问答论坛。你应该尝试一下,发布你的代码,并问一些关于哪些不起作用的具体问题。^^这是非常正确的,值得以后记住。我我已经回答了,但主要是因为这些挑战总是激发我的好奇心。希望能有所帮助。我一直在尝试一些脚本,但都失败了。我会确保在下次我问一些事情时发布它们。谢谢!哇,真是太棒了