我有近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
我需要以上格式,有人对此有任何指示吗?
答案 0 :(得分:2)
\.
匹配-AllMatches
一个衬板:
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函数输出结果仅用于演示目的。