3

2011-04-13 00:09:07,731情報[STDOUT]04/1300:09:07情報...

やあみんな。コードの一部を投稿しますが、投稿する価値はないと思います。私がやろうとしているのは、上記のような行を含むログファイルがあるということです。私がする必要があるのは、最後の行のタイムスタンプを取得し、最後の5分間のすべての行を保持することです(最後の200行などではなく....これは簡単です)。誰か助けてもらえますか?私はウェブ、いくつかのまともなヒントを検索しましたが、それでも何も起こっておらず、地獄のようにイライラしています。ありがとう!

4

4 に答える 4

5

ファイルを繰り返し処理し、タイムスタンプが実行開始時刻から 5 分以内のすべての行を出力する単純な Perl スクリプトを次に示します。効率を高めるために、行がタイムスタンプ順であると仮定すると、これを変更して、最初の印刷可能な行に遭遇したときにブール値フラグを設定し、その時点からのテストをスキップできます。

#!/usr/bin/perl
use POSIX qw(mktime);

$now = time();
while(<>)
{
    ($yy,$mm,$dd,$h,$m,$s,$t) = /^(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+),(\d+)/;
    $t = mktime($s+$t/1000, $m, $h, $dd, $mm-1, $yy-1900);
    print "$_" if ($t >= $now-300);
}
于 2011-04-25T19:55:41.847 に答える
2

あなたの最新のコメントから、ログの最後のタイムスタンプとその 5 分前のエントリを見つける方法に関心があることが分かります。

Jim Garrison のソリューションにパッチを適用して、これを置き換えることができると思います。

$now = time();

これとともに:

open F, "<server.log" or die $!;
seek F,-1000,2; # set pos to last 1000 bytes
my @f = <F>;
$_ = $f[$#f];
($yy,$mm,$dd,$h,$m,$s,$t) = /^(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+),(\d+)/;
$now = mktime($s+$t/1000, $m, $h, $dd, $mm-1, $yy-1900);

$nowログに最後のタイムスタンプが含まれるようになりました。

「-1000」は、ログの少なくとも 1 行を超えるのに十分な長さに概算しました。ログに長い行があると予想される場合は、もっと高く設定することもできますが、私が見たところ、最後のログ エントリはかなり短くする必要があります。

巨大なログ ファイルがあり、次の検索でパフォーマンスを向上させたい場合は、見積もりを使用してシークを実行し、ファイル内の最後の、たとえば 1000000 バイトを見つけることができます。

seek F, -1000000, 2;

幸運を!

于 2011-04-28T14:27:31.703 に答える
1

regexp グラブ: 00:09:07 を使用してすべての行を反復処理し、現在の時刻 (ローカルタイムなど) と照合します。ファイルに異なる日付のエントリが含まれている場合は、regexp を使用して日付を取得し、locatimeの出力を使用して再度比較します

于 2011-04-25T19:37:11.133 に答える
0

以下のログで動作するようにスクリプトを変更する方法

Dec 18 09:41:18 sd
Dec 18 09:46:29 sds
Dec 18 09:48:39 sds
Dec 18 09:48:54 sds
Dec 18 09:54:47 sds
Dec 18 09:55:33 sds
Dec 18 09:55:38 sds
Dec 18 09:57:58 sds
Dec 18 09:58:10 sds
Dec 18 10:00:50 sdsd
Dec 18 10:03:43 sds
Dec 18 10:03:50 sdsd
Dec 18 10:04:06 sdsd
Dec 18 10:04:15 sdsd
Dec 18 10:14:50 wdad
Dec 18 10:19:16 sdadsa
Dec 18 10:19:23 dsds
Dec 18 10:21:03 sadsd
Dec 18 10:22:54 adas
Dec 18 10:27:32 qadad
于 2013-12-26T08:01:08.113 に答える