我如何选择多列和扩展属性使用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命令可以改进吗?

谢谢!

我重新格式化了一下命令,我认为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 

好的,基本上是在用你的东西。我正在做一个ForEach循环对所有的匹配找到的选择字符串,并按文件名分组。然后,对于每个文件,我循环遍历展开Matches的组,然后仅为匹配的文本取唯一值。对于每个值,我输出一个对象,其中包含文件名和匹配的值。

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
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新