gpt4 book ai didi

algorithm - 快速过滤日志文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:45 25 4
gpt4 key购买 nike

我正在尝试编写一个 PowerShell 脚本来对生产日志文件进行一些分析。

我需要按大约 50-100 个值过滤大约 250 万行文本 - 如果 O(nm),则可能需要 250,000,000 次迭代。

我试过 Get-Content | Select-String 但这看起来非常慢。

有没有任何方法可以解决这个问题而不用为每个值遍历每行一次?

编辑

所以,日志文件看起来有点像这样(datetime : process_id : log_level : message)

2016-01-30 14:01:22.349 [ 27]  INFO XXX YYY XXXFX
2016-01-30 14:01:28.146 [ 16] INFO XXXD YY Z YYY XXXX
2016-01-30 14:01:28.162 [ 16] DEBUG YY XXXXX YY XX P YYY
2016-01-30 14:01:28.165 [ 16] DEBUG YY XXXXX YY XX YYY
2016-01-30 14:01:28.167 [ 16] DEBUG YY XXXXX YY XX YYY
2016-01-30 14:01:28.912 [ 27] INFO XXX YY XXGXXX YYYYYY YY XX

我可能正在寻找值 D、F、G 和 Z。

值可以是二进制数字串、十六进制数字串、两者的组合、常规文本和标点符号串,或竖线分隔值。

最佳答案

经验法则:

  • StreamReaderGet-Content 快,比 Import-Csv 快。
  • 字符串运算比通配符匹配快,比正则表达式匹配快。

如果足以检查您的日志行是否包含任何给定字符串,您可能需要这样的东西:

$reader  = [IO.StreamReader]'C:\path\to\your.log'
$filters = 'foo', 'bar', ...

while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine()
if ($filters | Where-Object {$line.Contains($_)}) {
$line
}
}

$reader.Close()
$reader.Dispose()

如果你想使用 StreamWriter 而不仅仅是回显输出,只需像这样调整代码:

$reader  = [IO.StreamReader]'C:\path\to\your.log'
$writer = [IO.StreamWriter]'C:\path\to\output.txt'
$filters = 'foo', 'bar', ...

while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine()
if ($filters | Where-Object {$line.Contains($_)}) {
$writer.WriteLine($line)
}
}

$reader.Close(); $reader.Dispose()
$writer.Close(); $writer.Dispose()

根据日志行的结构以及过滤器值以及它们需要如何应用,过滤器逻辑可能需要调整。不过,您需要实际显示日志格式和过滤器示例。

关于algorithm - 快速过滤日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35119112/

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