首页 > 解决方案 > 从看到多行的选择字符串中获取特定内容

问题描述

我正在运行一个选择字符串来查找我的一个日志中何时发生错误。当我运行命令时,我在之前拉 3 行,之后拉 0 行。

运行命令时,我得到了返回结果,但我不知道如何捕获结果的特定部分,因此我可以将其设置为仅通过电子邮件向我发送我需要的特定内容。

我正在使用的选择字符串是:

Select-String -Path \\testserver\d$\_Prod\product\Logs\App\product.log -Pattern 'Unable to authenticate/authorize user:' -Context 3,0

运行此命令后我得到的结果是:

  \\testserver\d$\_Prod\product\Logs\App\product.log:24443:26 Jul 2019 09:57:52,238 INFO (com.product.vs.ws.policy.AuthenticationHandler:validate:55) - Done authenticating/authorizing user: adam
  \\testserver\d$\_Prod\product\Logs\App\product.log:24444:26 Jul 2019 09:57:52,238 INFO (com.product.vs.ws.impl.ImportExportServiceImpl:importEmployeesWithAckByDS:529) - Importing multiple employees. Company/user: 1111222113
  \\testserver\d$\_Prod\product\Logs\App\product.log:24445:26 Jul 2019 09:57:52,316ERROR (com.product.vs.ws.impl.ImportExportServiceImpl:importEmployeesWithAckByDS:538) - Unable to process request!
> \\testserver\d$\_Prod\product\Logs\App\product.log:24446:com.bsi.ef.exception.AuthenticationException: Unable to authenticate/authorize user: adam

我需要的部分是带有名称的模式和带有值的公司/用户。

我不确定如何获取模式和公司/名称的信息。只有当模式匹配时,我才需要这两个信息。如果我删除 -Context 3,0 它只会给我模式匹配,我也需要公司/名称。

来自日志的信息

26 Jul 2019 09:57:38,037 INFO (com.product.vs.ws.policy.AuthenticationHandler:validate:42) - Authenticating/authorizing user: adam
26 Jul 2019 09:57:38,037 INFO (com.product.vs.ws.policy.AuthenticationHandler:validate:55) - Done authenticating/authorizing user: adam
26 Jul 2019 09:57:38,037 INFO (com.product.vs.ws.impl.ImportExportServiceImpl:importEmployeesWithAckByDS:529) - Importing multiple employees. Company/user: 1111222113
26 Jul 2019 09:57:38,115ERROR (com.product.vs.ws.impl.ImportExportServiceImpl:importEmployeesWithAckByDS:538) - Unable to process request!
com.product.vs.exception.AuthenticationException: Unable to authenticate/authorize user: adam
    at com.product.vs.ws.impl.ImportExportServiceImpl.importEmployeesWithAckByDS(ImportExportServiceImpl.java:531)`

^ Original post

我今天发现Unable to authenticate/authorize user即使公司/用户未显示在日志中,我也需要它来返回结果。

今天日志中的信息

29 Jul 2019 10:25:25,181 INFO (com.product.vs.svc.ImpStgReqProcessCreator:run:68) - No records available in Staging Table for pick up...
29 Jul 2019 10:27:25,197 INFO (com.product.vs.svc.ImpStgReqProcessCreator:run:68) - No records available in Staging Table for pick up...
29 Jul 2019 10:28:30,725 INFO (com.product.vs.policy.AuthenticationHandler:validate:42) - Authenticating/authorizing user: Johnny
29 Jul 2019 10:28:30,725ERROR (com.product.vs.ws.policy.AuthenticationHandler:validate:50) - Unable to authenticate/authorize user: Johnny`

标签: powershell

解决方案


  • 您发布的Select-String输出只是返回的结构化MatchInfo对象的默认表示。
  • 由于该模式基于 RegEx,您可以使用更复杂的多行 RegEx
    -或 -
    分别评估 .context/.precontext 属性。
$Result = Select-String .\product.log -Pattern 'Unable to authenticate/authorize user:' -Context 3,0

$Result | Get-Member

$Result.Context | Get-Member

查看上述命令的输出,然后尝试

$Result = Select-String .\product.log -Pattern 'Unable to authenticate/authorize user: (.*)' -Context 3,0
$Result.Matches.Groups[1].Value
if (($Result.Context.PreContext -join '') -match 'Company/user: (\d+)'){$Matches[1]}

获取尾随名称的添加(捕获组)的内容和尾随公司编号的 $Matches 对象。

输出上述样本数据:

adam
111122211326

推荐阅读