【发布时间】:2021-11-04 09:05:01
【问题描述】:
首先,我有一个可靠的搜索(感谢 Stack Overflow 上的一些帮助),可以检查多个日志文件的一行中不同字符串的出现。
我现在的任务是包含多个搜索,因为有大约 20 个文件和大约十几个搜索条件,我不想访问这些文件超过 200 次。我相信最好的方法是在数组中,但到目前为止我尝试过的所有方法都失败了。
搜索条件由日期、一个固定的字符串 (ERROR) 和一个唯一的 java 类名组成,日期显然每天都在变化。这是我所拥有的:
$dateStr = Get-Date -Format "yyyy-MM-dd"
$errword = 'ERROR'
$word01 = [regex]::Escape('java.util.exception')
$pattern01 = "${dateStr}.+${errword}.+${word01}"
$count01 = (Get-ChildItem -Filter $logdir -Recurse | Select-String -Pattern $pattern01 -AllMatches |ForEach-Object Matches |Measure-Object).Count
Add-Content $outfile "$dateStr,$word01,$count01"
扩展它的简单方法是为我要搜索的每个类设置一个单独的三个命令条目(设置单词,设置模式然后搜索) - 我已经完成并且它有效,但它并不优雅并且然后我们正在处理 >200 个文件来运行搜索。我试图从一个简单的文本文件中读取 java 类,但结果不一,但为了简化对 12 种不同模式的搜索,我唯一能够开始工作的就是它。
【问题讨论】:
-
您是否尝试过从输入源生成所有组合模式,构建正则表达式 OR,并在您的
S-S调用中使用它? ///// 同样,S-S的-Path参数将比使用G-C和流水线阶段更快地读取行。 [咧嘴一笑] -
Select-String的-Pattern支持字符串数组。试试这个:'One Two Three' |Select-String -Pattern 'One', 'Three',然后这个:'Two Three Four' |Select-String -Pattern 'One', 'Three'(两种搜索模式中的任何一种都匹配两个输入行。)换句话说,你可以这样做:... |Select-String -Pattern $pattern01, $pattern02, $pattern03(这意味着:选择匹配$pattern01的字符串或$pattern02或$pattern03。
标签: arrays powershell search