1

HTTPアクセスログを通過し、正規表現パターンに基づいていくつかの行を除外し、それらを別のファイルにコピーするスクリプトがあります:

param($workingdate=(get-date).ToString("yyMMdd"))
Get-Content "access-$workingdate.log" | 
Select-string -pattern $pattern | 
Add-Content "D:\webStatistics\log\filtered-$workingdate.log"

ログは非常に大きく (最大 2 GB)、実行に最大 15 分かかります。上記のステートメントのパフォーマンスを改善するためにできることはありますか?

ご感想ありがとうございます!

4

3 に答える 3

2

パターンは示していませんが、問題の大部分を占めていると思います。

高速な正規表現パターンを構築するための詳細なアドバイスについては、ここ (確かに質問されているはずです) または他の場所で新しい質問を探すことをお勧めします。

しかし、最善のアドバイスは、パターンを固定し、すべての文字の長さが不明な実行を避けることです。

したがって、パターンのようなパターンの代わりに、末尾にpath/.*/.*\.jsa を使用し$て文字列の末尾に固定します。そうすれば、正規表現エンジンは一致しないことをすぐに判断できます。index.htmlそれ以外の場合は、かなり複雑なスキャンを実行する必要がありpath/.js文字列のどこにでも表示される可能性があります。もちろん、この例では、ファイル名がログ行の最後にあると想定しています。

アンカーは、行頭パターンでもうまく機能します。パターンは次のように見えるかもしれません^[^"]*"GET /myfile"が、ランレングスは不明ですが、少なくとも、最初の引用符を見つけた後、さらに引用符の検索を再開する必要がないことがわかっています。文字クラスでは、最初の引用符の後にパターンが一致しない[^"]ため、正規表現エンジンを停止できます。

于 2015-08-14T00:47:25.597 に答える
0

また、ストリームを使用すると速度が向上するかどうかを確認することもできます。上記のように、使用しているパターンがわからないため、テストできませんでしたが、このようなものが役立つ場合があります。

param($workingdate=(get-date).ToString("yyMMdd"))

$file = New-Object System.IO.StreamReader -Arg "access-$workingdate.log"
$stream = New-Object System.IO.StreamWriter -Arg "D:\webStatistics\log\filtered-$workingdate.log"

while ($line = $file.ReadLine()) {
    if($line -match $pattern){
        $stream.WriteLine($line)    
    }
}
$file.close()
$stream.Close()
于 2015-08-14T01:39:40.060 に答える