匹配两个不同文件中的字符串,并在下一行输出此+

时间:2019-07-20 13:01:45

标签: powershell

从一个相当复杂的合同中,我有两个.txt文件。这些文件如下所示:

文件1:

Hash: 5FD876CDF0FCFAF1E7F018F5A8519A7B

Path: /Users/foobar/Desktop/whatever.jpg

文件2:

Hash: 0EDEFB152D489163E603F8C55F5463A7

Path: c:\Migration\Templates\script.exe

这里的目标是比较File1和File2并找到匹配的哈希。找到匹配的哈希后,将它们(和以下路径)输出到另一个.txt文件中。

我对这个问题进行了过多的搜索,但是大多数解决方案都是为了发现差异或设计不同,因此我在Powershell中的专业知识还远远不足以正确地重写它们。

# pattern to match the Hashes from File2
$pattern = "^[a-f0-9]{32}$"

# read in File1 as an array to compare to
$set1 = Get-Content -Path 'C:\File1.txt'

# prepare to collect the results
$results = New-Object -TypeName System.Text.StringBuilder

# start scanning the text2 file for matches to text1 entries
Get-Content -Path 'C:\File2.txt'
if ($_ -match $pattern)
   {
        $hashes = $Matches['hash']
        if ($hashes -in $set1)
        {
            [void]$results.AppendLine($_)
        }
    }
}

# output the results
$results.ToString() | Out-File -FilePath 'C:\output.txt' -Encoding ascii

上面的代码还不够匹配,我需要帮助来完成它!

感谢您阅读我的帖子!

1 个答案:

答案 0 :(得分:1)

  • 您的模式锚点位于行首(^)且不包含前缀Hash:
  • 要获取路径,您还需要一个多行模式,该模式需要使用-raw参数读取文件,并在模式中包含开关(?sm)
  • 还不清楚在一个文件中是否存在多个Hash:/ Path:组合,以及要从中提取配对的文件数。

我建议:

  • 使用函数提取信息,或者
    1. 如果只有两个文件使用Compare-Object获取匹配对,或者
    2. 如果有更多文件,请按哈希收集输出和Group-Object,如果每个组计数超过1,则输出具有所有路径的组。

以下脚本从给定文件中提取哈希/路径对,并将其作为[PSCustomObject]输出。

## Q:\Test\2019\07\20\SO_57124977.ps1

function Extract-HashPath($filename){
    $Pattern = '(?sm)^Hash: (?<Hash>[0-9A-F]{32})(\r?\n)*Path: (?<Path>.*?)$'
    ((Get-Content $filename -raw) | 
        Select-String -Pattern $Pattern -AllMatches).Matches.Groups | ForEach-Object{
            Set-Variable -Name $_.Name -Value $_.Value
            if ($_.Name -eq 'Path'){
                [PSCustomObject]@{
                    Hash = $Hash
                    Path = $Path
                }
            }
        }

}

$File1HashPath = Extract-HashPath '.\File1.txt'
$File2HashPath = Extract-HashPath '.\File2.txt'
$File1HashPath
$File2HashPath

使用上述文件中的文本对输出进行采样(其中不包含可比较的哈希)

> Q:\Test\2019\07\20\SO_57124977.ps1

Hash                             Path
----                             ----
5FD876CDF0FCFAF1E7F018F5A8519A7B /Users/foobar/Desktop/whatever.jpg
0EDEFB152D489163E603F8C55F5463A7 c:\Migration\Templates\script.exe