maveric
Goto Top

Bash Command aus Perl absetzen

Moin,
mein Problem liegt glaube ich im Detail, aber ich habe leider keine Lösung finden könnten.
Ich habe ein Perl –Script, mit welchem ich eine Text Datei auswerte und die Ergebnisse, alle mit demselben Muster in eine neue Datei Schreibe. Nachdem das Passiert ist, sind leider von den 50.000 Zeilen ca. 100 die nicht Exakt dem Muster entsprechen und die beste Lösung und vor allem eine sehr schnelle ist für mich ein egrep, welches ich in 1min zusammen geschrieben hatte. Ich schaffe es jedoch nicht, dieses aus dem Perl - Skript aufzurufen.

system("less sqls.txt | egrep '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})(,\[)(.*)(\],)([0-9]{4,10})' > out.txt");

Das Statement nimmt die sqls.txt, welche durch das Perl Skript erstellt wurde, nudelt ein egrep drüber und schreibt das in die out.txt.

Mit der Out möchte ich dann im Skript weiter arbeiten.
Also kurz, wie schaffe ich es das er das Bash Statement ausführt?

Viele Grüße
Maveric

Content-ID: 196838

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

Ausgedruckt am: 26.11.2024 um 11:11 Uhr

jodalein
jodalein 11.01.2013 um 16:16:55 Uhr
Goto Top
Hi,

ich habe hier auch ein Perl script wo ich einen Bash aufruf mache. Ich habe auch hin und her probiert und dann am ende einfach ein 2. sh script erstellt was ich über System aufrufe, ist denke ich zwar nicht die eleganteste Lösung aber es klappt super


PERL...
system("SOWIESO.sh")== 0 or die "Bash Script failed";
PERL...

SOWIESO.sh
"CAT" sqls.txt | egrep '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})(,\[)(.*)(\],)([0-9]{4,10})' > out.txt


würde hier ein cat nehmen anstatt less (glaube liegt einfach eher nur an der gewonheit)

probiers einfach mal so aus.
bytecounter
bytecounter 11.01.2013 um 16:30:51 Uhr
Goto Top
Hallo,

warum nutzt Du bash, obwohl doch Perl in diesem Bezug geradezu mächtig ist?

vg
Bytecounter
Maveric
Maveric 15.01.2013 aktualisiert um 13:00:49 Uhr
Goto Top
@jodalein Ahoi, ich habe das jetzt so probiert, aber er schlägt immer genau an der Stelle fehl und gibt dem entsprechend die Fehlermeldung "Bash Script failed" aus. Die Idee hat mir aber gefallen, auch wenn es das Script auslagert.
Maveric
Maveric 15.01.2013 um 13:00:09 Uhr
Goto Top
Zitat von @bytecounter:
Hallo,

warum nutzt Du bash, obwohl doch Perl in diesem Bezug geradezu mächtig ist?

vg
Bytecounter

Weil es eine Zeile Code wäre und ich damit alles erreiche was ich brauche.
Es wäre für die Übersicht sehr gut gewesen, das Script ist eh sehr lang.
bytecounter
bytecounter 15.01.2013 aktualisiert um 15:09:15 Uhr
Goto Top
Dann würde ich zumindest mal den Fehlercode mit ausgeben:

system("SOWIESO.sh 2>&1")== 0   
        or die "system failed: $?";  

Dann könnte man ja zumindest sehen, warum er abbricht.

<edit>
Habe zusätzlich noch die Fehlerausgabe auf die Standardausgabe umgeleitet.
</edit>

vg
Bytecounter
Maveric
Maveric 17.01.2013 um 13:24:36 Uhr
Goto Top
Zitat von @bytecounter:
Dann würde ich zumindest mal den Fehlercode mit ausgeben:

> system("SOWIESO.sh 2>&1")== 0   
>         or die "system failed: $?";  
> 

Dann könnte man ja zumindest sehen, warum er abbricht.

<edit>
Habe zusätzlich noch die Fehlerausgabe auf die Standardausgabe umgeleitet.
</edit>

vg
Bytecounter

Ich habe das Problem jetzt wie folgt gelöst. Ich habe anstatt einen Einzeiler grep auf dem
zu erst gedachten weg abzufeuern die Sache jetzt in nativ Perl gelöst, wie auch oben
vorgeschlagen wurde.

Dazu habe ich folgenden Code integriert:

open(MYO, ">>$out");
open(MYI, "<$in");
while(<MYI>){

$linex = $_;

if($linex =~ m/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})(,\[)(.*)(\],)([0-9]{4,10})/g){

print MYO $1.$2.$3.$4.$5."\n";

}
}
close(MYO);
close(MYI);

Ich habe zwei Dateien vom Typ Txt als Stream geöffnet und iteriere über jede Zeile von MYI.
Sollte die Zeile mit meinem Regex auf true matchen, dann speichert er sie in den Stream MYO.
Wenn er damit fertig ist, kann ich mit der Geregexten Datei weiterarbeiten.

Viele Grüße
Maveric