Schrift
[thread]11853[/thread]

grep-Aufruf aus Perlscript funktioniert nicht



<< >> 9 Einträge, 1 Seite
Superfrank
 2008-05-21 14:00
#110047 #110047
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich habe eine Datei in der nach dem String

Code: (dl )
ClientConn:                 5


gesucht werden soll. Über den Shellbefehl

Code: (dl )
grep -P 'ClientConn:\s+5' /etc/mail/access


funktioniert das auch, ein

Code (perl): (dl )
my $got = `grep -P 'ClientConn:\s+5' /etc/mail/access`;


liefert ein leeres Ergebnis. Müssen in dem Perlscript evtl. irgendwelche Umgebungsvariablen gesetzt werden?

Viele Grüsse

Frank
lichtkind
 2008-05-21 14:03
#110048 #110048
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
eher nicht, qx interpoliert und deshalb nehme ich an du musst die slashes quoten
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
renee
 2008-05-21 14:04
#110049 #110049
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Escape mal den Backslash, also
Code (perl): (dl )
my $got = `grep -P 'ClientConn:\\s+5' /etc/mail/access`;
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/
Superfrank
 2008-05-21 14:12
#110050 #110050
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
vielen Dank für Eure Hilfe!

Es lag an dem \. Mit

Code (perl): (dl )
my $got = `grep -P 'ClientConn:\\s+5' /etc/mail/access`;


funktioniert es.

Viele Grüsse

Frank
sid burn
 2008-05-21 14:28
#110051 #110051
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ähm, wofür nutzt du bitte schön Perl wenn du grep aus der Shell aufrufst?

Datei in Perl öffnen und in Perl auslesen. Perl hat auch ein grep. Und wenn es ne Configdatei ist, kannst du die Datei einmal öffnen und nen hash daraus bauen. Deutlich besser...
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Superfrank
 2008-05-21 15:03
#110055 #110055
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
sid burn+2008-05-21 12:28:53--
Ähm, wofür nutzt du bitte schön Perl wenn du grep aus der Shell aufrufst?

Datei in Perl öffnen und in Perl auslesen. Perl hat auch ein grep. Und wenn es ne Configdatei ist, kannst du die Datei einmal öffnen und nen hash daraus bauen. Deutlich besser...


geht auch, ich weiß. Auf die Schnelle war mir das aber zu umständlich.

Viele Grüsse

Frank
nepos
 2008-05-21 16:47
#110066 #110066
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Naja, da ist das mit Backticks eher umständlich finde ich...
Gast Gast
 2008-05-21 21:03
#110075 #110075
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
!# /usr/bin/perl
use strict;
use warnings;

my $file='/etc/mail/access';

open(my $in, '<', $file) or die "konnte $file nicht oeffnen ($!)\n";
my @got=grep{$_=~/ClientConn:\s+5/}(<$in>);
close ($in);

if(@got>0)
{
 # was gefunden
}
else
{
 # nichts gefunden
}


Tippdauer: ~2Min
sid burn
 2008-05-23 19:06
#110191 #110191
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Gast+2008-05-21 19:03:19--
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
!# /usr/bin/perl
use strict;
use warnings;

my $file='/etc/mail/access';

open(my $in, '<', $file) or die "konnte $file nicht oeffnen ($!)\n";
my @got=grep{$_=~/ClientConn:\s+5/}(<$in>);
close ($in);

if(@got>0)
{
 # was gefunden
}
else
{
 # nichts gefunden
}


Tippdauer: ~2Min

Und wieviel Zeit hast du jetzt hier im Forum verschwendet weil du nicht beachtet hast das die Regex die du in System/qx angibst Doppelt Quoten musst?

Bis zu deiner Fragestellung und die erste Antwort sind 3 Min vergangen. Eine Antwort mit einer konkreten Lösung ist nach 5 Min gekommen. Und du hast nach 12 Min gepostet. Der Zeitaufwand dafür war ja jetzt wohl deutlich höher. Und die Frage ist wie lange hast du davor schon gegrübelt woran das lag inklusive Post schreiben? Wahrscheinlich lag der Zeitaufwand jetzt bei ~30Min.

Und bei soviel Zeitaufwand musst du jetzt:
1) die Regexe Quoten
2) Das Programm ist nicht mehr Platformunabhängig
3) Subshell starten ist langsamer
4) Das ganze kann auch Fehleranfälliger sein (konjuktiv)
5) Du musst die ergebnisse erstmal nochmal Splitten wenn du das selbe ergebnisse heraus bekommen möchtest wie das eingebaute grep.
6) Nicht jedes grep unterstützt den Schalter "-P" du kannst nichtmal sicher sein das dies Funktioniert.
7) Das Programm funktioniert mit dem Schalter -T nicht mehr
8) Dein Programm arbeitet einfach weiter selbst wenn die Datei mit dem Systemaufruf von grep nichts gefunden hat, oder die Datei aus rechte Problemen etc. nicht geöffnet werden konnte.

Die Vorteile bei einem qx/system() aufruf erschlagen mich ja regelrecht...

Ansonsten wenn es eine Datei ist die mehrere solche beziehungen hat dann kannst du das viel elegenater so lösen:

ungetestet:
Code: (dl )
my %config = map { m/ \A (.*?) : \s+ (.*) /xms } <$file>


Und danach kannst du folgendermaßen drauf zugreifen:

Code: (dl )
1
2
print $config{ClientConn}, "\n";
print $config{ClientIrgendwas}, "\n";


Das ganze kannst du dann auch in eine Subroutine packen der du nur einen Filenamen übergibst und es dir die Datenstruktur zurück liefert. Und das finde ich deutlich besser.

Der "Aufwand" lohnt sich schon sobald du zwei Dinge auslesen möchtest. Dann must du nicht für jeden Parameter ein grep starten und jedesmal die Datei neu durchgehen.

Und hättest du es sofort den Perl Weg gemacht wäre es sauberer du hättest die Probleme nicht und letztendlich hättest du sogar mehr Zeit gespart.

Quick & Dirty gibt es nicht und lohnt sich auch nicht. ;)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< >> 9 Einträge, 1 Seite



View all threads created 2008-05-21 14:00.