gpt4 book ai didi

powershell - 搜索文件中的某些字符串,而无需两次遍历内容

转载 作者:行者123 更新时间:2023-12-03 01:10:12 29 4
gpt4 key购买 nike

我有一个日志文件列表,这些日志文件每天在00:00:00创建,因此每天都记录在一个单独的日志文件中。每天都会基于4种不同的原因创建4个日志文件,我必须遍历它们并选择错误消息。

日志文件具有以下结构:

07.11.2016 12:00:41  Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:41 Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:41 fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument nicht gefunden: 0

07.11.2016 12:00:57 Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:57 Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:57 fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument nicht gefunden: 0

07.11.2016 12:01:13 Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:01:13 Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:01:13 fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument nicht gefunden: 0

如您所见,在每个块的底部都有一条消息“fataler fehler”,因此我需要将整个块放入一个数组中,然后在一个简单的电子邮件中将所有日志文件的所有“fataler fehler”块一起发送。

现在,我基本上已经有了代码,但是该代码要么有错误,要么需要执行10分钟以上,因为我在开始编写此问题之前5分钟就运行了它,但仍未完成。

目标:将所有块包含在 $FailArray变量中

您能告诉我实现目标的更好方法吗?我真的不喜欢两次使用 get-content,因为我觉得这没有必要,我敢肯定有比我更好的解决方案:
# Prepare Array
$FailArray = @()

# Search for Log Files
$a = gci "C:\path" -filter *.log | ? { $_.LastWriteTime -ge (get-date).AddDays('-1') }

# Loop over Log Files
$a | % {
# Are there errors in the log?
$x = get-content $_.FullName | ? { $_ -like "*Fehler*" }
# If there are errors in the block, get the "time stamp" of the Block, like 12:00:57
if ($x) { $y = $x | % { $_.split(' ')[1] } } else { return }
# Search the whole block, depending on the timestamp
$z = get-content $_.FullName | ? { $_ -like "*$y*" }
# Add found blocks to FailArray
$FailArray += $z
}

更多:
有时,该块的第一条消息的时间戳与其他消息的时间戳有1秒的不同-是否有可能以某种方式获得整个块? (只是一个不错的选择,没有必要)
07.11.2016 12:00:24  Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:25 Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:25 fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument nicht gefunden:

最佳答案

您可以使用-context参数并选择匹配项+实际匹配项上方的两行:

$FailArray = gci "C:\path" -filter *.log | ? { $_.LastWriteTime -ge (get-date).AddDays('-1') } | % {
Select-String -Path $_ -Pattern 'fataler Fehler' -Context 2,0 | foreach {$_.Context.PreContext; $_.Line}
}

关于powershell - 搜索文件中的某些字符串,而无需两次遍历内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40523628/

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