Gzip nutzen

hallo zusammen!
ich versuche gerade krampfhaft, mittels der standardmodule irgendwie gzip nutzbar zu machen, da mein provider die logfiles nur als „.gz“ zur verfügung stellt. bislang reichlich fruchtlos- ich hoffe, dass hier jemand einen tipp hat.
meine versuche:
zur ausführung von systemnahen (hier also: unix-)befehlen ist mir „system(…)“ bekannt. erster anlauf also

my $dekomp=system („gunzip access_log_2003-12-02.gz“);

resultat/ausgabe: 256

auf solche weise
my $dekomp=qx (gunzip access_log_2003-12-02.gz) || die („fehler: $!\n“);
oder
my $dekomp=gunzip access_log_2003-12-02.gz || die („fehler: $!\n“);

gibt es zwar eine fehlermeldung, aber $! ist leer.

schließlich dies:

open|gunzip (TEST, „access_log_2003-12-02.gz“) || die („fehler: $!\n“);

die antwort:
Not enough arguments for open at gzip.pl line 9, near „open|“
Bareword „TEST“ not allowed while „strict subs“ in use at gzip.pl line 9.

als unix-dau habe ich leider (noch) keine ahnung, welche argumente gzip hier gebrauchen könnte- super, wenn mir da noch wer auf die sprünge helfen könnte…
wichtig noch: ich habe leider keinen zugriff auf die error-logs.

vielleicht fällt ja wem von euch noch was ein.

greetings
bernd

Hallo Bernd !

hallo zusammen!
ich versuche gerade krampfhaft, mittels der standardmodule
irgendwie gzip nutzbar zu machen, da mein provider die
logfiles nur als „.gz“ zur verfügung stellt. bislang reichlich
fruchtlos- ich hoffe, dass hier jemand einen tipp hat.

perldoc Compress::Zlib
http://www.perldoc.com

meine versuche:
zur ausführung von systemnahen (hier also: unix-)befehlen ist
mir „system(…)“ bekannt. erster anlauf also

my $dekomp=system („gunzip access_log_2003-12-02.gz“);

resultat/ausgabe: 256

…weiss ich nichts mit anzufangen, gunzip sollte nur 0…2 zurückgeben, gibt es hinter denn eine access_log_2003-12-02 ? Findet er gunzip überhaupt ?

auf solche weise
my $dekomp=qx (gunzip access_log_2003-12-02.gz) || die
(„fehler: $!\n“);
oder
my $dekomp=gunzip access_log_2003-12-02.gz || die („fehler:
$!\n“);

gibt es zwar eine fehlermeldung, aber $! ist leer.

Ist doch ok, dann sollte das File (ohne .gz) rumliegen. Wenn du den Inhalt weiterverarbeiten willst, musst du gunzip schon mit -c sagen , das es nach stdout auspacken soll. Oder auch gleich zcat nehmen.

schließlich dies:

open|gunzip (TEST, „access_log_2003-12-02.gz“) || die
(„fehler: $!\n“);

die antwort:
Not enough arguments for open at gzip.pl line 9, near „open|“
Bareword „TEST“ not allowed while „strict subs“ in use at
gzip.pl line 9.

Logisch. perldoc -f open … RTFM

open(TEST, „zcat access_log_2003-12-02.gz |“) or die $!;

als unix-dau habe ich leider (noch) keine ahnung, welche
argumente gzip hier gebrauchen könnte- super, wenn mir da noch
wer auf die sprünge helfen könnte…

man gzip (gunzip, zcat)
http://www.bigbiz.com/cgi-bin/manpage?1+gunzip
falls du kein passendes OS hast.

Alexander

hallo zusammen!

Hi Bernd,

ich versuche gerade krampfhaft, mittels der standardmodule
irgendwie gzip nutzbar zu machen, da mein provider die
logfiles nur als „.gz“ zur verfügung stellt. bislang reichlich
fruchtlos- ich hoffe, dass hier jemand einen tipp hat.
meine versuche:
zur ausführung von systemnahen (hier also: unix-)befehlen ist
mir „system(…)“ bekannt. erster anlauf also

my $dekomp=system („gunzip access_log_2003-12-02.gz“);

resultat/ausgabe: 256

Returncode von gunzip ist also 1. Perldoc perlfunc liefert in der Beschreibung von system die folgende Erklaerung:

The return value is the exit status of the program
as returned by the "wait" call. To get the actual
exit value divide by 256. See also the exec entry
elsewhere in this document. This is not what you
want to use to capture the output from a command,
for that you should use merely backticks or "qx//",
as described in the section on "`STRING`" in the
perlop manpage. Return value of -1 indicates a
failure to start the program (inspect $! for the
reason).

auf solche weise
my $dekomp=qx (gunzip access_log_2003-12-02.gz) || die
(„fehler: $!\n“);
oder
my $dekomp=gunzip access_log_2003-12-02.gz || die („fehler:
$!\n“);

gibt es zwar eine fehlermeldung, aber $! ist leer.

Existiert die Datei? Hast du im Verzeichnis auch Schreibrechte, damit gunzip bzw. gzip die Files entpacken können?

Um an die Fehlermeldung von gunzip bzw. gzip zu kommen, kannst du ja mal folgendes probieren:

open LOG, "gzip -cd access\_log\_2003-12-02.gz 2\>&1 |";
while 
{
 print;
}
close LOG;

Dies sollte dir entweder den Inhalt des access.logs ausgeben (-c: Ausgabe der unkomprimierten Datei auf STDOUT) oder die Fehlermeldung von gzip (2>&1 : leite STDERR an STDOUT um…).

Gruss
bernhard

bingo!
hi bernhard,
das war wohl der entscheidende tipp am rande:

Hast du im Verzeichnis auch
Schreibrechte, damit gunzip bzw. gzip die Files entpacken
können?

eben nicht- weswegen ich die kandidaten erstmal dort wegkopieren muss.
dann klappt dies hier prima:

open LOG, „gzip -cd access_log_2003-12-02.gz 2>&1 |“;

wozu ich nochmal eine (anfänger- :wink: verständnisfrage hätte, weil mir pipes noch nicht so vertraut sind:
ich sehe richtig, dass auf diese weise eine pipe vom access-log in richtung unix/gzip geöffnet wird?

auch hierzu hätte ich noch eine anfängerfrage (wenn’s nicht nervt):

2>&1

was passiert dort technisch genau- kannst du mir da mal 1-2 stichworte geben? (dann kann ich mich mal weiterinformieren :wink:

gruß & dank
bernd

hi bernhard,

nochmal hi,

wozu ich nochmal eine (anfänger- :wink: verständnisfrage hätte,
weil mir pipes noch nicht so vertraut sind:
ich sehe richtig, dass auf diese weise eine pipe vom
access-log in richtung unix/gzip geöffnet wird?

nicht ganz. Jedes Programm besitzt unter UNIX (auch unter DOS / Windows, soweit ich mich recht erinnere) 3 'Standardein/ausgabekanaele, naemlich STDIN (Eingabe, normalerweise die Tastatur…, Nr. 0), STDOUT (Ausgabe, Console - normalerweise Kanal 1) und STDERR (fuer Fehlerausgaben, normal auch Console, #2). Mit dem Pipe-Zeichen verbindet man STDOUT des Programm(aufrufs) auf der linken Seite mit dem STDIN des anschliessenden Programms; in diesem Fall also die Ausgabe des gzip-Kommandos mit dem Perl-Programm (bzw. dessen neuen Eingabekanal LOG).

auch hierzu hätte ich noch eine anfängerfrage (wenn’s nicht
nervt):

2>&1

was passiert dort technisch genau- kannst du mir da mal 1-2
stichworte geben? (dann kann ich mich mal weiterinformieren
:wink:

Stichworte: ‚I/O-Redirection‘, Pipes, Ausgabeumleitung

2>&1 bedeutet, dass STDERR (#2) auf den Kanal #1 (also STDOUT) umgeleitet wird, mit anderen Worten, Fehlermeldungen von gzip, die das Programm wie alle ‚guten‘ Prozesse auf STDERR schreibt, gehen auch in die Pipe, damit Perl sie dort mitkriegt (sonst verschwinden die Meldungen offensichtlich im digitalen Nirwana, da du ja wahrscheinlich keinen Consolenzugang hast).

gruß & dank

gern geschehen

viel spass noch beim rumexperimentieren.
bernhard