在 PowerShell 中使用多行正则表达式循环遍历多个文本文件
Loop through several text files with a multiple line regex in PowerShell
我正在尝试使用正则表达式搜索多个文本文件。当正则表达式在一行上匹配时,我设法让它工作,但是当我测试一个在一行和另一行末尾匹配的正则表达式时,它不起作用。
我了解到您首先需要将整个文件读入 variable/array,然后进行正则表达式搜索。我没能成功。
文件夹和文件的结构是
根文件夹
├─17-11-01
│ ├─trace-0.log
│ └─痕迹-1.log
└─17-11-02
├─痕迹-0.log
└─痕迹-1.log
我已经设法获得了文件的完整路径,但我不确定我是如何读取文件内容的。我找到了 [IO.File]::ReadAllText($Path)
但不确定如何将它添加到下面的命令中。
Get-ChildItem $Path -Filter $Filter -Recurse |
Select FullName |
ft -HideTableHeaders
总结我正在尝试做的事情。
- 进行正则表达式搜索,其中匹配的文本将跨越多行。
- 同一根下多个路径中的多个文件。
- 计算每个正则表达式匹配项。
我目前在 Windows 7 上使用 PowerShell v2,但我可以升级到 v4。该脚本主要用于 Windows 10 和 Windows Server 2012 R2 及更高版本。
编辑 1
这是日志文件和正则表达式的示例。
FINER:进入服务:ABC
2017-11-03T08:22:18.557+0100 - 信息:一些信息。
2017-11-03T08:22:18.557+0100 - 信息:一些信息。
2017-11-03T08:22:18.557+0100 - 信息:一些信息。
2017-11-03T08:22:18.557+0100 - 信息:一些信息。
2017-11-03T08:22:18.557+0100 - 信息:一些信息。
2017-11-03T08:22:18.557+0100 - 信息:一些信息。
2017-11-03T08:22:18.557+0100 - 信息:请求已完成。
(2017-10-.*FINER\: Entering service: (ABC |ABC1|ABC2))[\s\S]*?(INFO: \d\d\d\d\d\d\d\d\d\d\d\d The request has been completed)
编辑 2 解决方案
这是最终代码。我示例中的正则表达式与示例日志不匹配。
$Files = (Get-ChildItem $Path -Filter $FilterFile -Recurse | Get-Content | Out-String)
(Select-String -inputObject $Files -pattern $Regex -AllMatches).Matches.Count
表达式工作正常,这不是问题所在。
谢谢!
我正在尝试使用正则表达式搜索多个文本文件。当正则表达式在一行上匹配时,我设法让它工作,但是当我测试一个在一行和另一行末尾匹配的正则表达式时,它不起作用。
我了解到您首先需要将整个文件读入 variable/array,然后进行正则表达式搜索。我没能成功。
文件夹和文件的结构是
根文件夹 ├─17-11-01 │ ├─trace-0.log │ └─痕迹-1.log └─17-11-02 ├─痕迹-0.log └─痕迹-1.log
我已经设法获得了文件的完整路径,但我不确定我是如何读取文件内容的。我找到了 [IO.File]::ReadAllText($Path)
但不确定如何将它添加到下面的命令中。
Get-ChildItem $Path -Filter $Filter -Recurse |
Select FullName |
ft -HideTableHeaders
总结我正在尝试做的事情。
- 进行正则表达式搜索,其中匹配的文本将跨越多行。
- 同一根下多个路径中的多个文件。
- 计算每个正则表达式匹配项。
我目前在 Windows 7 上使用 PowerShell v2,但我可以升级到 v4。该脚本主要用于 Windows 10 和 Windows Server 2012 R2 及更高版本。
编辑 1 这是日志文件和正则表达式的示例。
FINER:进入服务:ABC 2017-11-03T08:22:18.557+0100 - 信息:一些信息。 2017-11-03T08:22:18.557+0100 - 信息:一些信息。 2017-11-03T08:22:18.557+0100 - 信息:一些信息。 2017-11-03T08:22:18.557+0100 - 信息:一些信息。 2017-11-03T08:22:18.557+0100 - 信息:一些信息。 2017-11-03T08:22:18.557+0100 - 信息:一些信息。 2017-11-03T08:22:18.557+0100 - 信息:请求已完成。
(2017-10-.*FINER\: Entering service: (ABC |ABC1|ABC2))[\s\S]*?(INFO: \d\d\d\d\d\d\d\d\d\d\d\d The request has been completed)
编辑 2 解决方案
这是最终代码。我示例中的正则表达式与示例日志不匹配。
$Files = (Get-ChildItem $Path -Filter $FilterFile -Recurse | Get-Content | Out-String)
(Select-String -inputObject $Files -pattern $Regex -AllMatches).Matches.Count
表达式工作正常,这不是问题所在。
谢谢!