gpt4 book ai didi

powershell - for循环中的多个选择字符串以分隔文件

转载 作者:行者123 更新时间:2023-12-05 01:54:54 25 4
gpt4 key购买 nike

我编写此脚本是为了根据 4 个不同的搜索条件搜索大量文本文件 (~100,000) 并导出到 4 个单独的文件,我认为在加载每个文件时对每个文件执行所有 4 个搜索比像下面的第一次迭代一样进行 4 次完整搜索。由于我对 Powershell 还很陌生,所以我可能会遗漏一些其他主要的低效率问题。

我将此脚本从第一个版本重写到第二个版本,但无法弄清楚如何像第一个版本那样让路径和数据一起显示。我正在努力在循环中引用对象,并将第二个版本拼凑在一起,这是有效的,但没有给我必要的文件路径。

似乎我只是遗漏了一两件让我朝着正确方向前进的小东西。预先感谢您的帮助

第一个版本:

Get-ChildItem -Filter *.txt -Path "\\file\to\search" -Recurse | Select-String -Pattern "abc123" -Context 0,3 | Out-File -FilePath "\\c:\out.txt"
Get-ChildItem -Filter *.txt -Path "\\file\to\search2" -Recurse | Select-String -Pattern "abc124" -Context 0,3 | Out-File -FilePath "\\c:\out2.txt"
Get-ChildItem -Filter *.txt -Path "\\file\to\search3" -Recurse | Select-String -Pattern "abc125" -Context 0,3 | Out-File -FilePath "\\c:\out3.txt"
Get-ChildItem -Filter *.txt -Path "\\file\to\search4" -Recurse | Select-String -Pattern "abc126" -Context 0,3 | Out-File -FilePath "\\c:\out4.txt"

输出:

  \\file\that\was\found\example.txt:84:  abc123  
\\file\that\was\found\example.txt:90: abc123
\\file\that\was\found\example.txt:91: abc123

第二个版本:

##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Configuration $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

############################################ Global Parameters #############################################
$SearchPath="\\file\to\search"
$ProgressFile=""\\progress\file\ResultsCount.txt"
$records = 105325
##----------------------------------------- End Global Parameters -----------------------------------------

########################################### Search Parameters ##############################################
##Search Pattern 1
$Pattern1="abc123"
$SaveFile1="\\c:\out.txt"

##Search Pattern 2
$Pattern2="abc124"
$SaveFile2="\\c:\out2.txt"

##Search Pattern 3
$Pattern3= "abc125"
$SaveFile3= "\\c:\out3.txt"

##Search Pattern 4
$Pattern4= "abc126"
$SaveFile4="\\c:\out4.txt"

##Search Pattern 5
$Pattern5= ""
$SaveFile5=""

##----------------------------------------- End Search Parameters ------------------------------------------
##$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ End of Config $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

############################### SCRIPT #####################################################################
## NOTES
## ------
##$files=Get-ChildItem -Filter *.txt -Path $SearchPath -Recurse ## Set all files to variable #### Long running, needs to be a better way #######
##$records=$files.count ## Set record #
Get-ChildItem -Filter *.txt -Path $SearchPath -Recurse | Foreach-Object { ## loop through search folder
$i=$i+1 ## increment record
##
Get-Content $_.FullName | Select-String -Pattern $Pattern1 -Context 0,3 | Out-File -FilePath $SaveFile1 ## pattern1 search
Get-Content $_.FullName | Select-String -Pattern $Pattern2 | Out-File -FilePath $SaveFile2 ## pattern2 search
Get-Content $_.FullName | Select-String -Pattern $Pattern3 -Context 0,1 | Out-File -FilePath $SaveFile3 ## pattern3 search
Get-Content $_.FullName | Select-String -Pattern $Pattern4 -Context 0,1 | Out-File -FilePath $SaveFile4 ## pattern4 search
##Get-Content $_.FullName | Select-String -Pattern $Pattern5 -Context 0,1 | Out-File -FilePath $SaveFile5 ## pattern5 search (Comment out unneeded search lines like this one)
$progress ="Record $($i) of $($records)" ## set progress
Write-Host "Record $($i) of $($records)" ## Writes progress to window
$progress | Out-File -FilePath $ProgressFile ## progress file
} ##
############################################################################################################

输出:

abc123
abc123
abc123

编辑:此外,我正在尝试找出一种不必在记录数量中进行硬编码以获得体面的进度读数的好方法,我注释掉了我认为可行的方式(脚本的第一行和第二行) ,但需要一种比重新运行相同搜索两次更有效的方法,一次用于计数,一次用于 for 循环。

我会对您提供的任何运行时效率信息非常感兴趣。

最佳答案

[编辑 - 感谢 mklement0 指出关于速度和 -SimpleMatch 开关的错误。 [咧嘴一笑]]

Select-String cmdlet 将接受一个-Path 参数...它是 FAR [我在想 Get-Content,而不是 Get-ChildItem] 比使用 Get-ChildItem 将文件提供给 S-S 更快。 [咧嘴一笑]

此外,-Pattern 参数接受正则表达式 OR 模式,如 Thing|OtherThing|YetAnotherThing - 它接受简单的字符串模式,如果你使用 -SimpleMatch 开关参数。

代码的作用...

  • 定义源目录
  • 定义文件规范
  • 将这两个加入通配 rune 件路径
  • 构建一个字符串模式数组以供使用
  • 使用要搜索的路径和字符串数组调用 Select-String
  • 使用 Group-Object 和计算属性根据 S-S 调用中 .Line 属性的最后部分对匹配项进行分组<
  • 将其保存到 $Var
  • 在屏幕上显示

此时,您可以使用每个 GroupInfo.Name 属性来选择要发送到每个文件的项目并构建您的文件名。

代码...

$SourceDir = 'D:\Temp\zzz - Copy'
$FileSpec = '*.log'
$SD_FileSpec = Join-Path -Path $SourceDir -ChildPath $FileSpec

$TargetPatternList = @(
'Accordion Cajun Zydeco'
'better-not-be-there'
'Piano Rockabilly Rowdy'
)

$GO_Results = Select-String -Path $SD_FileSpec -SimpleMatch $TargetPatternList |
Group-Object -Property {$_.Line.Split(':')[-1]}

$GO_Results

输出...

Count Name                      Group                                                                                                                                     
----- ---- -----
6 Accordion Cajun Zydeco {D:\Temp\zzz - Copy\Grouping-List_08-02.log:11:Accordion Cajun Zydeco, D:\Temp\zzz - Copy\Grouping-List_08-09.log:11:Accordion Cajun Zy...
6 Bawdy Dupe Piano Rocka... {D:\Temp\zzz - Copy\Grouping-List_08-02.log:108:Bawdy Dupe Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:108:Bawdy...
6 Bawdy Piano Rockabilly... {D:\Temp\zzz - Copy\Grouping-List_08-02.log:138:Bawdy Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:138:Bawdy Pian...
6 Dupe Piano Rockabilly ... {D:\Temp\zzz - Copy\Grouping-List_08-02.log:948:Dupe Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:948:Dupe Piano ...
6 Instrumental Piano Roc... {D:\Temp\zzz - Copy\Grouping-List_08-02.log:1563:Instrumental Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:1563:I...
6 Piano Rockabilly Rowdy {D:\Temp\zzz - Copy\Grouping-List_08-02.log:1781:Piano Rockabilly Rowdy, D:\Temp\zzz - Copy\Grouping-List_08-09.log:1781:Piano Rockabil...

请注意,.Group 包含来自 S-S 调用发出的匹配行的数组。您可以将其发送到您的输出文件。

关于powershell - for循环中的多个选择字符串以分隔文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70455871/

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