Поиск шаблона в каталоге и извлечение строки из файлов с помощью PowerShell - PullRequest
0 голосов
/ 24 января 2019

У меня есть почти 400 .sql файлов, где мне нужно найти конкретный шаблон и вывести результаты.

* 1003 например *

* 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 голосов
/ 25 января 2019
  1. вам нужно экранировать точку в RegEx, чтобы сопоставить буквенную точку с обратной косой чертой \.
  2. чтобы получить все совпадения в строке, используйте параметр -AllMatches
  3. вам нужен лучший RegEx, чтобы соответствовать строке mydb до следующего пробела
  4. итерация результатов строки выбора с помощью объекта ForEach

Один вкладыш:

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)

0 голосов
/ 24 января 2019

Сначала извлеките результат вашего запроса файла в массив, затем итерируйте его и извлеките содержимое файла, используя сопоставление с регулярным выражением:

$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 для вывода результата длятолько для демонстрационных целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...