排除文本文件中不包含一个或多个字符串的行

时间:2019-03-25 09:36:44

标签: python-3.x powershell text preprocessor data-processing

我有多个服务器日志文件。它们总共包含大约500.000行日志文本。我只想保留包含“已下载”和“日志”的行。我要排除的行集中在错误日志和基本系统操作上,例如“客户端启动”,“客户端重新启动”等。

我们要查找的行的示例如下:

[22:29:05]: Downloaded 39 /SYSTEM/SAP logs from System-4, customer (000;838) from 21:28:51,705 to 21:29:04,671

应保留的行应由日期字符串补充,该字符串是日志文件名称的一部分。 ($ date)

此外,由于接收到的日志相当不规则,因此应将过滤后的文件转换为一个csv文件(列:时间戳,日志下载,系统目录,系统类型,客户,开始时间,结束时间,日期[从文件名添加到每行)。将空格分隔为逗号的替换操作只是第一次尝试为数据引入某种结构。该文件应加载到python仪表板程序中。

目前,需要3,5分钟来预处理3个Txt文件,而即使有可能,最大目标是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
}

1 个答案:

答案 0 :(得分:1)

这是我可以管理的最快速度。我没有使用-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“过滤”可以提高速度。