根据另一个对象中的字符串查找一个对象中的线

时间:2018-12-27 09:46:05

标签: powershell powershell-v5.1 pattern-finding

根据另一个文件中的行在一个文件中查找行。

我有一个对象$A,其中有些行如下:

0c7d3283-bec2-4db1-9078-ebb79d21afdf
200bc957-26dd-4e8e-aa6e-00dc357c4ac2
218e0d2a-0e8b-4a68-8136-8f5dd749a614

我想在对象$B中找到那些行的匹配项,然后将匹配项的行打印到输出文件中。

我已经尝试了一个星期(我在Powershell中的第一周:)) 我来了:

$F = $B | ForEach-Object{ $A | Select-String -Pattern $_$ -AllMatches| Select-Object line } 

但这不会给我任何返回结果。

谁愿意帮助我?

1 个答案:

答案 0 :(得分:1)

如果要匹配第一个数组,并且要匹配第二个数组中字符串的一部分,则可以执行以下代码:

$A = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "218e0d2a-0e8b-4a68-8136-8f5dd749a614")

$B = @("Something 0c7d3283-bec2-4db1-9078-ebb79d21afdf", "Something else 200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "Something also e3df3978-beb7-4545-bc48-ff40d8453be1")

foreach ($Line in $A) {
    if($B -match $Line) {
        $B | Where-Object {$_ -match $Line}
    }
}

我们首先循环遍历第一个对象中的所有行,然后比较该行是否与第二个数组中的任何行匹配。如果找到匹配项,我们将遍历数组B以找到A所在的行匹配的位置。

您可以使这段代码更漂亮,但这是我编写它的最容易理解的方式。

旧答案
您可以使用Compare-Object cmdlet比较两个数组,然后使用-IncludeEqual开关显示匹配的位置,然后使用-ExcludeDifferent开关删除不匹配的结果。 然后将其输出并放入文件中。一个简单的测试可能是这样的:

$A = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "218e0d2a-0e8b-4a68-8136-8f5dd749a614")

$B = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "e3df3978-beb7-4545-bc48-ff40d8453be1")


(Compare-Object -ReferenceObject $A -DifferenceObject $B -ExcludeDifferent -IncludeEqual).InputObject | Out-File .\output.txt

这应该在Shells当前工作目录中输出一个文件,其中包含两个匹配的GUID:

0c7d3283-bec2-4db1-9078-ebb79d21afdf
200bc957-26dd-4e8e-aa6e-00dc357c4ac2

不包含不匹配项的地方。