使用PowerShell

时间:2019-01-24 20:14:02

标签: regex powershell scripting

我有近400个.sql文件,我需要在其中搜索特定的模式并输出结果。

例如

* file1.sql

select * from mydb.ops1_tbl from something1 <other n lines>

* file2.sql

select * from mydb.ops2_tbl from something2 <other n lines>

* file3.sql

select * from mydb.ops3_tbl ,mydb.ops4_tbl where a = b <other n lines>

预期结果

  

file1.sql mydb.ops1_tbl

     

file2.sql mydb.ops2_tbl

     

file3.sql mydb.ops3_tbl mydb.ops4_tbl

PowerShell中的以下脚本-能够获取文件名

Get-ChildItem -Recurse -Filter *.sql|Select-String -pattern "mydb."|group path|select name

PowerShell中的以下脚本-能够提取行

Get-ChildItem -Recurse -Filter *.sql | Select-String -pattern "mydb." |select line

我需要以上格式,有人对此有任何指示吗?

2 个答案:

答案 0 :(得分:2)

  1. 您需要对RegEx中的点进行转义以将文字点与反斜杠\.匹配
  2. 要获取一行中的所有匹配项,请使用参数-AllMatches
  3. 您需要更好的RegEx才能将mydb字符串匹配到下一个空格
  4. 使用ForEach-Object迭代选择字符串的结果

一个衬板:

Get-ChildItem -Recurse -Filter *.sql|Select-String -pattern "mydb\.[^ ]+" -Allmatches|%{$_.path+" "+($_.Matches|%{$_.value})}

分手

Get-ChildItem -Recurse -Filter *.sql|
    Select-String -Pattern "mydb\.[^ ]+" -Allmatches | ForEach-Object{
        $_.path+" "+($_.Matches|ForEach-Object{$_.value})
    }

示例输出:

Q:\Test\2019\01\24\file1.sql mydb.ops1_tbl
Q:\Test\2019\01\24\file2.sql mydb.ops2_tbl
Q:\Test\2019\01\24\file3.sql mydb.ops3_tbl mydb.ops4_tbl

如果您不希望像Expected result这样的完整路径(尽管您正在递归),
$_.path替换为(Split-Path $_.path -Leaf)

答案 1 :(得分:1)

首先,将文件查询的结果提取到一个数组中,然后对其进行迭代并使用正则表达式匹配提取文件内容:

$files = Get-ChildItem -Recurse -Filter *.sql|Select-String -pattern "mydb."|group path|select name
foreach ($file in $files)
{
    $str = Get-Content -Path $file.Name
    $matches = ($str | select-string -pattern "mydb\.\w+" -AllMatches).Matches.Value

    [console]::writeline("{0:C} {1:C}", $file.Name, [string]::Join(' ', $matches) ) 
}

我使用.NET WriteLine函数输出结果仅用于演示目的。