【问题标题】:Excluding lines, which are not containing one or multiple strings from text file排除文本文件中不包含一个或多个字符串的行
【发布时间】:2019-03-25 18:58:25
【问题描述】:

我有多个服务器日志文件。它们总共包含大约 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

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

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

目前预处理 3 个 Txt-Files 需要 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
}

【问题讨论】:

  • 在问题中您说您想要保留包含“已下载”和“日志”的行,但在代码中您过滤了Downloaded 和@987654324 @。请给我们一些您想要保留的行的更多示例,如果可能的话,请提供 $date 部分应取自的文件名的示例。
  • 需要为 SAP 过滤。谢谢,我只是以正确的方式编辑它。文件名是这样的SAPlogsfiles0190701.log

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


【解决方案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“过滤”来获得的。

【讨论】:

  • 非常感谢!运行时间减少到 7-9 秒。
猜你喜欢
  • 2012-10-07
  • 2011-06-04
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
相关资源
最近更新 更多