Regex 分析包含2个字符串的行以及它们之间的行的日志文件

Regex 分析包含2个字符串的行以及它们之间的行的日志文件,regex,string,powershell,parsing,Regex,String,Powershell,Parsing,我正在尝试解析一些大型日志文件,以检测编码错误的发生。识别缺陷就是在不同的行上找到一系列的字符串,其中日期介于两者之间。我不擅长描述事物,所以举个例子: ffds[sid=EPS\U ffds,50]版本:01.00.00 瞧 ck服务器失败 2017年7月22日上午8:41:15 |某些服务器|信息|响应处理。TreatEPSResponse()将处理响应或事件。Response.ServiceID[Server_06]Response.Response[com.schema.fcc.ffd

我正在尝试解析一些大型日志文件,以检测编码错误的发生。识别缺陷就是在不同的行上找到一系列的字符串,其中日期介于两者之间。我不擅长描述事物,所以举个例子:


ffds[sid=EPS\U ffds,50]版本:01.00.00
瞧
ck服务器失败
2017年7月22日上午8:41:15 |某些服务器|信息|响应处理。TreatEPSResponse()将处理响应或事件。Response.ServiceID[Server_06]Response.Response[com.schema.fcc.ffds.BufferReply]
我将通过多个日志搜索此序列的多个实例:
bufferfailed
on,后跟
Server_35;
服务器可以是任意两位数字,并且永远不会在同一行。
Buffer failed
在找到
Server#
之前将不会重复。 介于两者之间的日期和时间,但猜测如果这是可能的,它也会被捕获

理想情况下,我会将类似这样的内容传输到另一个文件

Buffer Failed - none" 7/22/2017 8:41:15 AM [Server_06]
但是它似乎不能跨行工作。

选择字符串
只能在作为单个字符串接收输入时匹配跨多行的文本。另外,
通常匹配除换行符以外的任何字符(
\n
)。如果希望它也匹配换行符,则必须在正则表达式前面加上修饰符
(?s)
。否则,您需要包含换行符的表达式,例如
[\s\s]
(.|\n)

也可以建议将匹配锚定在
expressionDetail
而不是实际的细节,因为这样会使匹配更加灵活

这样的东西应该会给你你想要的结果:

$re = '(?s)exceptionDetail="(.*?)".*?(\d+/\d+/\d+ \d+:\d+:\d+ [AP]M).*?\[(.*?)\] Response\.Response'

... | Out-String |
    Select-String -Pattern $re -AllMatches |
    Select -Expand Matches |
    ForEach-Object { '{0} {1} [{2}]' -f $_.Groups[1..3] }

表达式使用非贪婪匹配和3个捕获组来提取异常详细信息、时间戳和服务器名。

您的日志文件是XML格式的吗?如果您的文件是XML,我建议您使用XML命令,而不是字符串命令。它不是一个XML文件,但即使是这样,我也不能将任何第三方实用程序用作文件所在的服务器,因为这些服务器具有用于信用卡交易的PCI合规性。我正在搜索的错误以XML格式记录在日志中,但日志不是XML。我想,如果这是我能想到的唯一解决方案,那么可以只将XML数据过滤到另一个文件中,然后尝试遍历它。获取“必须用反斜杠()转义未转义的分隔符”在这里,不知道为什么(\d+/\d+/\d+\d+:\d+:\d+[AP]M)@NoodlesPokerandSportsMedia regex101.com不喜欢未替换的正斜杠。请在实际的PowerShell控制台中进行测试。
$re = '(?s)exceptionDetail="(.*?)".*?(\d+/\d+/\d+ \d+:\d+:\d+ [AP]M).*?\[(.*?)\] Response\.Response'

... | Out-String |
    Select-String -Pattern $re -AllMatches |
    Select -Expand Matches |
    ForEach-Object { '{0} {1} [{2}]' -f $_.Groups[1..3] }