排除文本文件中不包含一个或多个字符串的行
Excluding lines, which are not containing one or multiple strings from text file
我有多个服务器日志文件。它们总共包含大约 500.000 行日志文本。我只想保留包含 "Downloaded" 和 "Log" 的行。我要排除的行集中在错误日志和基本系统操作,如 "client startup"、"client restart" 等。
我们正在寻找的行的一个例子是:
[22:29:05]: Downloaded 39 /SYSTEM/SAP logs from System-4, customer (000;838) from 21:28:51,705 to 21:29:04,671
要保留的行应由日期字符串补充,日期字符串是日志文件名的一部分。 ($日期)
此外,由于接收到的日志是非结构化的,过滤后的文件应转换为一个csv文件(列:时间戳、日志下载、系统目录、系统类型、客户、开始时间、结束时间、日期[添加到文件名的每一行]。将空格转换为逗号的替换操作只是第一次尝试将某些结构引入数据。该文件应该加载到 python 仪表板程序中。
目前预处理 3 个 Txt 文件需要 2.5 分钟,而目标是最多 5-10 秒,如果可能的话。
非常感谢您的支持,因为自上周一以来我一直在为此苦苦挣扎。也许 powershell 不是最好的方法?我愿意寻求任何帮助!
目前我运行这个powershell脚本:
$files = Get-ChildItem "C:\Users\AnonUser\RestLogs\*" -Include *.log
New-Item C:\Users\AnonUser\RestLogs\CleanedLogs.txt -ItemType file
foreach ($f in $files){
$date = $f.BaseName.Substring(22,8)
(Get-Content $f) | Where-Object { ($_ -match 'Downloaded' -and $_ -match 'SAP')} | ForEach-Object {$_ -replace " ", ","}{$_+ ','+ $date} | Add-Content CleanedLogs.txt
}
这大概是我能做到的最快速度了。我没有使用 -split
与 -replace
或特殊的 .NET 方法进行测试:
$files = Get-ChildItem "C:\Users\AnonUser\RestLogs\*" -Include *.log
New-Item C:\Users\AnonUser\RestLogs\CleanedLogs.txt -ItemType file
foreach ($f in $files) {
$date = $f.BaseName.Substring(22,8)
(((Get-Content $f) -match "Downloaded.*?SAP") -replace " ",",") -replace "$","$date" | add-content CleanedLogs.txt
}
一般来说,通过移除循环和 Where-Object
"filtering."
可以提高速度
我有多个服务器日志文件。它们总共包含大约 500.000 行日志文本。我只想保留包含 "Downloaded" 和 "Log" 的行。我要排除的行集中在错误日志和基本系统操作,如 "client startup"、"client restart" 等。
我们正在寻找的行的一个例子是:
[22:29:05]: Downloaded 39 /SYSTEM/SAP logs from System-4, customer (000;838) from 21:28:51,705 to 21:29:04,671
要保留的行应由日期字符串补充,日期字符串是日志文件名的一部分。 ($日期)
此外,由于接收到的日志是非结构化的,过滤后的文件应转换为一个csv文件(列:时间戳、日志下载、系统目录、系统类型、客户、开始时间、结束时间、日期[添加到文件名的每一行]。将空格转换为逗号的替换操作只是第一次尝试将某些结构引入数据。该文件应该加载到 python 仪表板程序中。
目前预处理 3 个 Txt 文件需要 2.5 分钟,而目标是最多 5-10 秒,如果可能的话。
非常感谢您的支持,因为自上周一以来我一直在为此苦苦挣扎。也许 powershell 不是最好的方法?我愿意寻求任何帮助!
目前我运行这个powershell脚本:
$files = Get-ChildItem "C:\Users\AnonUser\RestLogs\*" -Include *.log
New-Item C:\Users\AnonUser\RestLogs\CleanedLogs.txt -ItemType file
foreach ($f in $files){
$date = $f.BaseName.Substring(22,8)
(Get-Content $f) | Where-Object { ($_ -match 'Downloaded' -and $_ -match 'SAP')} | ForEach-Object {$_ -replace " ", ","}{$_+ ','+ $date} | Add-Content CleanedLogs.txt
}
这大概是我能做到的最快速度了。我没有使用 -split
与 -replace
或特殊的 .NET 方法进行测试:
$files = Get-ChildItem "C:\Users\AnonUser\RestLogs\*" -Include *.log
New-Item C:\Users\AnonUser\RestLogs\CleanedLogs.txt -ItemType file
foreach ($f in $files) {
$date = $f.BaseName.Substring(22,8)
(((Get-Content $f) -match "Downloaded.*?SAP") -replace " ",",") -replace "$","$date" | add-content CleanedLogs.txt
}
一般来说,通过移除循环和 Where-Object
"filtering."