簡體   English   中英

如何使用Powershell select-string -Allmatch選擇多個列並擴展屬性?

[英]How do I select multiple columns and expand properties using powershell select-string -Allmatch?

我正在搜索文本文件(* .sql)的集合,查找是否出現以9開頭的8位數字。文件中可能存在這些數字的多個實例,並且文件的每一行上可能有多個實例。 我只希望輸出顯示每個文件中每個8位數字的唯一出現。 這是我到目前為止的內容:

Select-String "9[0-9]{8}" "*.sql" -AllMatches | Select-Object FileName, @{N="Value";E={ $_.matches |  %{$_.groups[0].value}}} | Select-Object  -unique FileName,Value  

我的輸出如下所示:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      {907500507, 907520700, 907520701, 907520703...} 
File1.sql                      {907520725, 907520727, 907520728, 907520729} 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      {990603919, 990603925, 990603926} 
File2.sql                      {991100103, 991100103}
File2.sql                      {990700023, 990700504, 990700521, 990740520...} 
File3.sql                      907500044

等等....

我想做的是擴展數組,以便當我通過select -unique傳遞它時,實際上我只會得到每個文件中包含的唯一8位數字。

這就是我想要的:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      907500507
File1.sql                      907520700
File1.sql                      907520701
File1.sql                      907520703 
File1.sql                      907520725
File1.sql                      907520727
File1.sql                      907520728
File1.sql                      907520729 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      990603919
File2.sql                      990603925
File2.sql                      990603926 
File2.sql                      991100103
File2.sql                      990700023
File2.sql                      990700504
File2.sql                      990700521
File2.sql                      990740520 
File3.sql                      907500044

等等...

我怎樣才能做到這一點? 我當前的powershell命令可以改進嗎?

謝謝!

好吧,主要是跑掉您擁有的東西。 我正在對選擇字符串找到的所有匹配項進行ForEach循環,然后按文件名將它們分組。 然后,對於每個文件,我遍歷展開“匹配”的組,然后僅對匹配的文本取唯一值。 對於每個值,我輸出一個包含文件名和匹配值的對象。

ForEach($File in Select-String "9[0-9]{8}" "*.sql" -AllMatches | Group FileName){
    $File.group|select -expand matches|Select Value -Unique|%{
        new-object PSObject -property @{
            FileName=$File.Name
            Match=$_.value
        }
    }
}

我對命令進行了一些重新格式化,我認為PowerShell速記的簡潔性質使其更難發現問題。

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | `
    Select-Object  -unique FileName,Value 

您的原始命令為Select-String返回的每個MatchInfo產生一條輸出行。 MatchInfo表示文本文件的匹配行。 我相信當文件中的一行包含多個匹配值時,您將獲得一組值。

我對其進行了修訂,以闡明我們希望為每個MatchInfo中的每個RegexMatch提供一個輸出對象,也就是說,為每個匹配值提供一個輸出對象。

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Foreach-Object { 
        # $_ is MatchInfo for each matching line in file
        $fileName = $_.FileName 
        $_.Matches | Foreach-Object { 
            # $_ is RegexMatch for each match in line
            $_ | Select-Object -Property @{N="FileName";E={$fileName} },Value
        } 
    } | Select-Object  -unique FileName,Value 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM