sk4r
Goto Top

Bash 2 Perl

Hallo,

ich habe mir hier ein kleines BASH-Script zusammen gebastelt.
Es sucht in der Datei
y2log
nach dem Ausdruck
total_progress_value@
und gibt das, was sich hinter Stern in
= '*')  
verbirgt (nämlich einen Zahlenwert) aus.

(
while true
do
       tail /var/log/YaST2/y2log | grep "total_progress_value@" | grep -v grep | sed "s|^.*= '||g;s|')$||g" | while read wert; do wget http://webserver/test.cgi?value=$wert; done  
done
)&

Funktioniert soweit alles wunderbar. Warum ich das in Klammern gesetzt habe? Damit es im Hintergrund läuft und meinen Installationsprozess nicht beeinträchtigt.

Da die Anforderung geändert worden ist und nun Perl benötigt wird, brauche ich ein paar Ansätze. Ich habe leider null Kenntnisse in Perl, was jedoch nicht bedeutet, dass ich es nicht lernen möchte.

Vielen Dank für Antworten.

LG
sk4r

Content-ID: 149519

Url: https://administrator.de/contentid/149519

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

H41mSh1C0R
H41mSh1C0R 23.08.2010 um 14:47:55 Uhr
Goto Top
http://gd.tuwien.ac.at/languages/perl/Hajji-Perlkurs/part1/flowcontrol. ...

Schleifentyp aussuchen den du brauchst und dann:

system("command"); # öffnet eine sub shell
$prog = `command`; # backticks -> dabei wird die ausgabe zusätzlich in die Variable gespeichert .. geht bei system nat. auch
exec("command"); # das geht auch

Dann solltest du deine ganze tail Zeile so übernehmen können.
sk4r
sk4r 23.08.2010 um 14:57:39 Uhr
Goto Top
Hi H41mSh1C0R,

vielen Dank für deine Antwort.

Es muss auf jeden Fall eine while-Schleife sein, die dauerhaft true ist.

while (1=1) {
    # subshell ?!?
    $prog = `grep "total_progress_value@" | grep -v grep | sed "s|^.*= '||g;s|')$||g" | while read wert; do wget http://webserver/test.cgi?value=$wert; done`;  
    exec("tail -f /var/log/YaST2/y2log");  
}

Hab ich das so richtig verstanden?
H41mSh1C0R
H41mSh1C0R 23.08.2010 um 15:55:12 Uhr
Goto Top
nein von den 3 zeilen kannst du eine der 3 varianten benutzen.

Die erste wird in einer subshell ausgeführt und so weiter, halt das was in Kommentar dahinter steht.
sk4r
sk4r 23.08.2010 um 15:59:01 Uhr
Goto Top
Okay, vielen Dank.

Ich hab mir jetzt folgendes zusammengebaut. Leider funktioniert es noch nicht ganz.

open LOGFILE, "/var/log/YaST2/y2log" or die $!;  
while (<LOGFILE>) {
	if ($_ =~ /total_progress_value@.= '[0-9]*')/) {  
		system ('wget "http://webserver/test.cgi?value=$1"');  
	}
}
close(LOGFILE);

Mir ist noch nicht klar, wie ich den Wert, der zwischen den beiden Hochkommata steht, in die $1 Variable Packe. Die Zeile, in der diese Zahl auftaucht beinhaltet den Ausdruck "total_progress_bar@.......= '50')
Was mich interessiert, ist genau die 50 (die sich aber ständig ändert).
sk4r
sk4r 24.08.2010 um 15:06:54 Uhr
Goto Top
use strict;

open (LOGDATEI, "/var/log/YaST2/y2log") || die "FEHLER!";  
while ($zeile = <LOGDATEI>) {
        if ($zeile =~ /total_progress_value\@.*\=\ \'([0-9]+)\'\)/) {  
                system ('wget "http://jimbo/test.cgi?value=$1"');  
        }
}
close(LOGDATEI);

Hab nochmal etwas gebastelt. Leider funktioniert es nicht wirklich. Ich bekomme die wget Ausgabe nicht. Woran kann das liegen?

[ Die Zeile im Log sieht wie folgt aus: total_progress_value@812878952735525= '41') ] <-- Danach soll gesucht werden, wobei sich die Zahl 41 zwischen 0-99 bewegt. Diesen Zahlenwert hätte ich gern über wget an mein CGI Script geschickt.
H41mSh1C0R
H41mSh1C0R 24.08.2010 um 16:30:59 Uhr
Goto Top
ist wget nicht:

Quelle: Wikipedia

Wget ist ein freies Kommandozeilenprogramm des GNU-Projekts zum Herunterladen von Dateien aus dem Internet.

Was soll $1 sein? Wo nimmst du $1 her? Soll das der Wert von total_progress_value sein?
sk4r
sk4r 31.08.2010 um 08:42:24 Uhr
Goto Top
Hi,

$1 bezieht sich auf --> ([0-9]+).

Da ich SLES 11 SP1 nutze und Linux mit wget ausgestattet ist, hätten wir das Problem ebenfalls gelöst.

Aber die Lösung habe ich bereits gefunden.