Schrift
[thread]851[/thread]

Letzte 10 Zeilen einer Textdatei ausgeben

Leser: 7


<< |< 1 2 3 4 ... 8 >| >> 74 Einträge, 8 Seiten
TrioxX
 2006-12-03 12:20
#9222 #9222
User since
2006-11-08
10 Artikel
BenutzerIn
[default_avatar]
Hi,

ich versuche folgendes:

Ich habe eine Datei log.txt. Diese würde ich nun ganz gerne Zeilenweise auslesen (Array) und dann das Array auslesen und die letzten 10 Zeilen dieser Textdatei formatiert wieder ausgeben.

Gesamte Logs speicher ich derzeit so:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
return bless({});

sub logOutputStrings
{
my($self,$main,$commands) = @_;

my @commands = grep {$main->{settings}{log_messages}{(split(/\|/,$_->[2]))[0]}} @$commands;
return if $#commands<0;

$main->open(local *LOG, '>>'.$main->translateName('vardir::messages.log'));
foreach (@commands)
{
my $user = defined($_->[0])?$_->[0]:'';
my $room = defined($_->[1])?$_->[1]:'';
print LOG "$main->{runtime}{now}|$user|$room|$_->[2]\n";
}

if ($main->{settings}{max_messageslog_size}>0 && $main->{settings}{messageslog_backups_count}>0 && tell(LOG)>$main->{settings}{max_messageslog_size})
{               # rotate log now
unlink($main->translateName("vardir::messages.$main->{settings}{messageslog_backups_count}.log"));
for (my $i=$main->{settings}{messageslog_backups_count}-1;$i>=0;$i--)
{
my $j=$i+1;
rename($main->translateName("vardir::messages.$i.log"),$main->translateName("vardir::messages.$j.log"));
}
$main->close(*LOG);
rename($main->translateName("vardir::messages.log"),$main->translateName("vardir::messages.1.log"));
}
else
{
$main->close(*LOG);
}
}


$main ist eine globale Variable, die zur Verwaltung und Kombination meiner Plugins dient.

Nunja... Wie dem auch sei. Meine Textdateien werden in folgendem Format gespeichert:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1164963438||lobby|entered|trioxx|TrioxX|lobby
1164963450||lobby|leaved|trioxx|TrioxX|lobby
1164963530||lobby|entered|trioxx|TrioxX|lobby
1164963537||lobby|leaved|trioxx|TrioxX|lobby
1164963580||lobby|entered|trioxx|TrioxX|lobby
1164963588||lobby|leaved|trioxx|TrioxX|lobby
1164963742||lobby|entered|trioxx|TrioxX|lobby
1164963758||lobby|leaved|trioxx|TrioxX|lobby
1164963823||lobby|entered|trioxx|TrioxX|lobby
1164963832||lobby|leaved|trioxx|TrioxX|lobby
1164963945||lobby|entered|trioxx|TrioxX|lobby
1164964076||lobby|leaved|trioxx|TrioxX|lobby
1164964079||lobby|entered|trioxx|TrioxX|lobby
1164964088||lobby|leaved|trioxx|TrioxX|lobby
1165086722||lobby|entered|trioxx|TrioxX|lobby
1165086778||lobby|leaved|trioxx|TrioxX|lobby


Wie könnte ich nun alles, ab 1164963742 auslesen und anzeigen lassen?

Eine komplette Logdatei lese und formatiere ich derzeit so:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
sub log_handler
{
my($self,$main) = @_;

$main->{template_vars}{backaddr} = 'javascript:history.back()';

$main->fatal_error('nopermission') unless $main->hasPermission('admin_log');

my $lognum = int($main->{input}{log});
my $filename = $main->translateName('vardir::messages.' . ($lognum ? "$lognum." : '') . 'log');

$main->open(local *LOG,$filename) || $main->fatal_error('couldnotopen',{file => $filename});
my @entries = <LOG>;
$main->close(*LOG);

$main->{template_vars}{log_filename}=$filename;
$main->printTemplate('admin/log_top');

my %rooms = map {$_ => 1} split(/\s+/,$main->{input}{rooms});
foreach (@entries)
{
s/[\n\r]//g;
my ($time,$user,$room,$message) = split(/\|/,$_,4);
if (($user eq '' && $room eq '' && $main->{input}{show_global})
|| ($user ne '' && $main->{input}{show_private})
|| ($room ne '' && !$rooms{$room} && $main->{input}{show_nonexistent})
|| ($room ne '' && $main->{input}{"show_room.$room"}))
{
$message = $main->fromOutputString($message);
if ($main->{input}{"show_template.$message->{template}"})
{

$message->{time} = $time;

$message->{_user} = $user;

$message->{_room} = $room;



$main->{template_vars}{params}=$message;


my $output = '';

$main->parseTemplate('log/'.$message->{template})->process($main,\$output);

print $output;
}
}
}

my $output = "\n";
$main->parseTemplate('admin/log_bottom')->process($main,\$output);
print $output;
}


Vllt. kann man das so ganz gut als Vorlage zum aufbauen nutzen.

Hoffe, jemand kann mir helfen ;)


edit pq: quote-tags in code-tags geaendert\n\n

<!--EDIT|pq|1165144761-->
ptk
 2006-12-03 13:18
#9223 #9223
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Man muss nicht alles mit perl machen:
Code: (dl )
tail -10 datei
.
renee
 2006-12-03 13:40
#9224 #9224
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn's unbedingt Perl sein soll, ist CPAN:File::ReadBackwards vielleicht hilfreich...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
PerlProfi
 2006-12-03 13:47
#9225 #9225
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Falls deine Logdatei nicht soo lang ist, dass du sie von hinten lesen musst, kannst du es auch so machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/perl
use strict;
use warnings 'all';

# die Informationen die du dir mit:
# open(IN, "<", $file) or die "Die Datei '$file' konnte nicht zum Lesen geoeffnet werden.";
# chomp(@arr = <IN>);
# close IN;
# geholt hast:
my @arr = qw(1164963438||lobby|entered|trioxx|TrioxX|lobby
1164963450||lobby|leaved|trioxx|TrioxX|lobby
1164963530||lobby|entered|trioxx|TrioxX|lobby
1164963537||lobby|leaved|trioxx|TrioxX|lobby
1164963580||lobby|entered|trioxx|TrioxX|lobby
1164963588||lobby|leaved|trioxx|TrioxX|lobby
1164963742||lobby|entered|trioxx|TrioxX|lobby
1164963758||lobby|leaved|trioxx|TrioxX|lobby
1164963823||lobby|entered|trioxx|TrioxX|lobby
1164963832||lobby|leaved|trioxx|TrioxX|lobby
1164963945||lobby|entered|trioxx|TrioxX|lobby
1164964076||lobby|leaved|trioxx|TrioxX|lobby
1164964079||lobby|entered|trioxx|TrioxX|lobby
1164964088||lobby|leaved|trioxx|TrioxX|lobby
1165086722||lobby|entered|trioxx|TrioxX|lobby
1165086778||lobby|leaved|trioxx|TrioxX|lobby);

# die letzten 10 Zeilen davon verwenden:
my @arr2;
for (0..9)
{
$_ = 10-$_;
push(@arr2, $arr[-$_]);
}

foreach my$line (@arr2)
{
# Informationen auslesen:
my @infos = split /\|\|/, $line;
@infos = ($infos[0], (split /\|/, $infos[1]));

# in @infos steht für die erste Zeile jetzt folgendes:
# 1164963742, lobby, entered, trioxx, TrioxX, lobby
# das kannst du, wenn du möchtest noch einem Hash zuweisen,
# dann wird deutlicher was das fuer infos sind
my %infos = (number => $infos[0],
place => $infos[1],
action => $infos[2],
member => $infos[3],
name => $infos[4],
from => $infos[5]);

# Informationen anzeigen:
print "\nINFOS:\n";
print "$_: ". $infos{$_} ."\n" foreach (keys %infos);
}


MfG PerlProfi\n\n

<!--EDIT|PerlProfi|1165146669-->
GwenDragon
 2006-12-03 13:53
#9226 #9226
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
WIe wäre es mit CPAN:File::ReadBackwards
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Relais
 2006-12-03 14:42
#9227 #9227
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Oder mit CPAN:Tie::File, das kann man sich angewöhnen, sogar soweit, daß es irgendwann in der .sig auftaucht...
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
renee
 2006-12-03 14:48
#9228 #9228
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@GwenDragon: Ich habe irgendwie ein déjà vu *g*
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
GwenDragon
 2006-12-03 15:55
#9229 #9229
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
[quote=renee,03.12.2006, 13:48]@GwenDragon: Ich habe irgendwie ein déjà vu *g*[/quote]
Sorry, war abgelenkt und habe nicht nach neuen Postings gesehen.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Gast Gast
 2006-12-04 10:39
#9230 #9230
Hi,

wie müsste meine PM denn ungefähr aussehen, wenn ich mit File::ReadBackwards arbeiten würde? Ich hab leider nicht ganz so viel Ahnung wie TrioxX, jedoch so ziemlich die selbe Frage :)
Gast Gast
 2006-12-04 10:41
#9231 #9231
Im übrigen... Das ganze sollte bei Möglichkeit so strukturiert sein, dass ich es per {GET|$params.texts} bsp. ausfurfen könnte.
<< |< 1 2 3 4 ... 8 >| >> 74 Einträge, 8 Seiten



View all threads created 2006-12-03 12:20.