在巨大的日志文件中搜索多个字符串

时间:2013-02-26 04:46:24

标签: windows string powershell full-text-search

Powershell问题

目前我有5-10个日志文件,每个文件大约20-25GB,需要搜索每个文件以检查900个不同的搜索参数是否匹配。我编写了一个基本的PowerShell脚本,它将在整个日志文件中搜索1个搜索参数。如果它匹配,它会将结果转储成一个单独的文本文件,问题是它很慢。我想知道是否有办法通过一次搜索所有900参数并仅查看日志一次来加快速度。任何帮助都会很好,即使它只是改进了剧本。

基本概述:

1个csv文件,其中列出了“item”列下的所有900个项目 1个日志文件(.txt) 1个结果文件(.txt) 1 ps1文件

这是我在PS1文件中为PowerShell提供的代码:

$search = filepath to csv file<br>
$log = "filepath to log file"<br>
$result = "file path to result text file"<br>
$list = import-csv $search <br>


foreach ($address in $list) {<br>
Get-Content $log | Select-String $address.item | add-content $result <br>

*"#"below is just for displaying a rudimentary counter of how far through searching it is <br>*
$i = $i + 1 <br>
echo $i <br>
}

2 个答案:

答案 0 :(得分:0)

900个搜索词是一个非常大的组。你能用正则表达式减小它的大小吗?一个简单的解决方案是基于逐行读取文件并查找匹配项。设置包含搜索词的regexp或文字字符串的集合。像这样,

$terms = @("Keyword[12]", "KeywordA", "KeyphraseOne") # Array of regexps
$src = "path-to-some-huge-file" # Path to the file
$reader = new-object IO.StreamReader($src) # Stream reader to file

while(($line = $reader.ReadLine()) -ne $null){ # Read one row at a time

    foreach($t in $terms) { # For each search term...
        if($line -match $t) { # check if the line read is a match...
            $("Hit: {0} ({1})" -f $line, $t) # and print match
        }
    }
}
$reader.Close() # Close the reader

答案 1 :(得分:0)

当然,根据您所使用的文件大小,您使用的任何解析器都会非常痛苦,但如果您的日志文件是标准格式(例如IIS日志文件),那么您可以考虑使用日志解析应用程序,如Log Parser Studio而不是Powershell?