7

私のスクリプトは 1 分に 1 回ログ ファイルを読み取り、タイムスタンプが前の分で始まる行を選択 (および処理) します。

これは簡単ですが (正規表現は単に "^$timestamp" です)、ログが大きくなると時間がかかる場合があります。

私の考えでは、必要な行は常にファイルの下部にあるため、下部から開始して上に向かって検索すると、はるかに少ない行を検索し、現在の行の 1 分前に到達すると停止します。に興味がある。

私の質問は、ファイルの上部ではなく下部から検索するにはどうすればよいですか? 「行 $length を読んで」、または「行 n を読んで」とさえ言えますか?

最後の質問:これはさらに高速になりますか?

理想的には、余分なものをインストールせずに、これをすべて自分のコードで実行したいと考えています。

ありがとう

4

3 に答える 3

14

get-content bigfile.txt -tail 10

これは、大量のメモリを使用することなく、ほぼ瞬時に巨大なファイルに適用されます。

テストでは、22 GB のテキスト ファイルを使用して実行しました。

「get-context bigfile.txt | select -Last 10」のようなことをするとうまくいきますが、すべての行 (または powershell のオブジェクト) をロードしてから選択する必要があるようです。

于 2015-01-28T19:40:11.130 に答える
5

正規表現を Get-Date + 必要な期間に変更することをお勧めしますか?

例(これにはログがないため、お詫び申し上げます)

$a = Get-Date
$hr =  $a.Hour
$min =  $a.Minute

次に、これらの値を使用して正規表現を構築し、必要な時間を選択します。まだ使用していない場合は、この Web サイトで正規表現をすばやく簡単に構築できます http://gskinner.com/RegExr/

別の修正があります。これを気に入っていただけると思います..

$a = get-content .\biglog.text

長さを使用して、配列を前後にスライスし、書き込みホストを選択文字列に変更し、正規表現または逆にやりたいことは何でも..

foreach($x in $a.length..0){ write-host $a[$x] }

get-content コマンドレットの後の別のオプションです。このオプションは配列を逆順に並べ替え、$a を下から上に読み取ります。

[array]::Reverse($a)

直流

于 2012-04-23T17:05:50.330 に答える
2

ファイルの最後のビットのみが必要な場合は、形式によっては、次のようにするだけです。


Get-Content C:\Windows\WindowsUpdate.log | Select -last 10

これにより、ファイル内で見つかった最後の 10 行が返されます。

于 2012-04-24T13:27:10.990 に答える