поиск в 10 000 файлов журнала для определенной строки, а затем вывод каждой строки, в которой находится эта строка, а также создание копии этого файла журнала

Уже было несколько таких вопросов, но ни один из них не был достаточно конкретным для моих целей.

Мне нужно выполнить поиск в 10 000 файлов журнала для определенной строки, а затем вывести каждую строку, в которой находится эта строка, а также создать копию этого файла журнала.

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

:Обновить

Благодаря Trondh я смог использовать его сценарий как идеальную основу и добавить необходимые мне функции. Надеюсь, это поможет кому-то еще :)

#Folder to search
$folder = read-host "Please specify the location of the search "

#Search for: 
$SearchTerm = read-host "type in the word you want to find Eg. Error or JobID "

#Files to include in search
$FileFilter = read-host "Enter Date Part of file filter Eg. 20140123 or 201401 "

#File to store log file copies in
$destinationfolder = "Backup-$SearchTerm"

#File to store results in
$newfile = "Search-Log-$SearchTerm.txt"

#Get the files according to filter. Recurse, but exclude directories
$files = Get-ChildItem -Path $folder -Include @("*$filefilter*.*") -recurse | where {$_.PSIsContainer -eq $false}
foreach ($file in $files)
    {
        $result = $file | Select-String $SearchTerm

        $result | add-content $newfile

        New-Item -ItemType Directory -Force -Path $destinationfolder  

        #If we get a hit, copy the file
        if ($result)
            {
                Write-host "Found match in file $($file.Name) ($($file.Directory))"
                #Add result to file
                $file | Copy-Item -Destination $destinationfolder 


                #Also output it
                $result 

            }

    }


   Write-Host "Search Completed!"

$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

person HeXDeMoN    schedule 23.01.2014    source источник
comment
Мой совет — использовать язык, который выводит как родной (или почти) код, такой как C++, C#, JAVA и т. д. Потому что анализ файлов с пакетной обработкой займет много времени.   -  person mihai_mandis    schedule 23.01.2014


Ответы (2)


Вот как бы я это сделал:

#Folder to search
$folder = "D:\trond.hindenes\Desktop\test"
#File to store log file copies in
$destinationfolder = "D:\trond.hindenes\Desktop\test2"
#Search for:
$SearchTerm = "BAT"
#Files to include in search
$FileFilter = "file*"

#Get the files according to filter. Recurse, but exclude directories
$files = Get-ChildItem -Path $folder -Include $filefilter -recurse | where {$_.PSIsContainer -eq $false}
foreach ($file in $files)
    {
        $result = $file | Select-String $SearchTerm

        #If we get a hit, copy the file
        if ($result)
            {
                Write-host "Found match in file $($file.Name) ($($file.Directory))"
                #Add result to file
                $file | Copy-Item -Destination $destinationfolder

                #Also output it
                $result

            }

    }
person Trondh    schedule 23.01.2014
comment
Ну, он ищет строку, но не делает копии файлов. - person HeXDeMoN; 23.01.2014
comment
Извините, не прочитал вопрос должным образом. Смотрите обновленный ответ. - person Trondh; 23.01.2014
comment
+1 хорошая работа .. теперь мне просто нужно выяснить, как в powershell работают введенные пользователем переменные, это не должно быть сложно: P - person HeXDeMoN; 23.01.2014
comment
только что заметил, что вы удалили запись информации в текстовый файл, но я думаю, что смогу понять это :) - person HeXDeMoN; 23.01.2014
comment
Все заработало благодаря вашему коду. :) Я обновлю свою основную тему кодом. - person HeXDeMoN; 24.01.2014

....
....
rem search for files that contain data
for /f "tokens=*" %%f in ('findstr /s /i /m /c:"%word%" "%drive%\*%data%*.log"') do (

    rem copy the file selected by findstr to target folder
    copy "%%~ff" "%targetFolder%"

    rem and echo the lines with the data to the results file
    findstr /n /i /c:"%word%" "%%~ff" >> "Search-Logs-Results-%word%.TXT"
)

findstr /m просто проверяет наличие строки в файле и оставляет файл при первом совпадении, записывая имя файла в стандартный вывод. Список файлов обрабатывается командой for. Для каждого из них файл копируется, а затем строки с нужным словом отправляются в файл отчета.

person MC ND    schedule 23.01.2014