Schrift
[thread]10575[/thread]

Zeichenkette in Datei suchen



<< >> 7 Einträge, 1 Seite
dschingis
 2007-10-15 12:58
#100819 #100819
User since
2007-10-15
5 Artikel
BenutzerIn
[default_avatar]
Zum ersten Posting erstmal ein HALLO an alle!!!

Ich bin recht neu im Thema Programierung, brauche dies allerdings um mir das eine oder andere der täglichen Arbeit zu erleichtern. Aus diesem Grund binich jetzt hier gelandet um ein wenig Hilfe zu bekommen.

Ich möchte in einer Datei eine bestimmte Zeichenkette suchen. Wird diese gefunden soll er mir ein true geben, sonnst ein false.
Ich hab mir ein Grundgerüst gebaut mit dem ich dies machen will, aber irgendwie klappt das nicht, bzw. mir fehlt noch etwas Grundwissen um es auf die Reihe zu bekommen.

Hier mal mein Anfang:

Code (perl): (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
#!/usr/bin/perl

# Suchdatei
$logfile = "/root/install.log";

# Suchstrings
$esx301 = "Installing VMware-esx-3.0.1-32039.i386.";
$esx302 = "Installing VMware-esx-3.0.2-52542.i386.";
$centOS = "centos-release - 10:5-0.0.el5.centos.2.i386 installieren";

#Suchdatei oeffnen und in Array kopieren
open(HANDLE,"<$logfile") or die "Die Datei $logfile konnte nicht geoeffnet werden! Fehler: $!";
@file=<HANDLE>;
close(HANDLE) or die "Die Datei $logfile konnte nicht geoeffnet werden! Fehler: $!";

#Zeilenweiser Vergleich nach Suchstring
        chomp(@file);
        foreach $line (@file)
        {
                if((chomp($line)) = $esx301)
                {
                        print "ESX 3.0.1 gefunden";
                }
                elsif((chomp($line)) = $esx302)
                {
                        print "ESX 3.0.2 gefunden";
                }
                elsif((chomp($line)) = $centOS)
                {
                        print "CentOS gefunden";
                }
                else
                {
                        print "Keine gueltige OS Version gefunden!!!"
                }
        }


Mein Gedankengang:
Er soll zeilenweise durch die eingelesene Datei suchen.
Findet er den ersten String, soll die erste ausgabe erfolgen.
Findet er den zweiten String, soll die zweite Ausgabe erfolgen. ...
Findet er nichts davon, soll er die letzte Ausgabe machen und beenden.
Die letzte Ausgabe soll allerdings erst kommen wenn er die Datei (das Array) fertig durchsucht hat und keine Zeile mehr übrig ist ... wäre wünschenswert.

Kann mir hier mal jemand einen Gedankenanstoß geben um mich auf die Richtige Spur zu bringen?
Ihr sollt mir das ja nicht schreiben, nur ein paar Tipps das ich richtig suche ... ich will ja was dabei lernen!

Gruß und Danke
Dschingis
nepos
 2007-10-15 13:07
#100821 #100821
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du machst da keinen Vergleich sondern eine Zuweisung. Zum Vergleichen musst du == für Zahlen und eq für Strings benutzen.
Kein richtiger Fehler, aber einmal chomp() reicht auch. Das musst du nicht nochmal für jede Zeile extra machen.

Ach ja, Filehandles sollte man besser so schreiben und bei open() die Variante mit 3 Argumenten benutzen, das ist sicherer:
Code (perl): (dl )
1
2
3
open (my $fh, '<', $logfile)...
my @file =<$fh>;
close($fh)


Daneben solltest du dir gleich angewöhnen, use strict; und use warnings in deinen Skripten zu benutzen. Durch strict wirst du z.B. gezwungen, deine Variablen mittels
Code (perl): (dl )
my $variable...
zu deklarieren.
Linuxer
 2007-10-15 13:14
#100823 #100823
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

1.
Benutze "use strict;" und "use warnings;" in Deinen Skripten.
Ersteres zwingt Dich zu sauberer Variablendeklaration und zweiteres gibt Dir Warnungen, wenn etwas unsauber zu sein scheint (z.B. Verwendung nicht initialisierter Variablen)
strict
warnings

2.
Würde ich für eine simple Suche die Datei nicht in einen Array lesen, sondern zeilenweise auslesen und die Suche umsetzen:
Code (perl): (dl )
1
2
3
4
while ( my $line = <$filehandle> ) {
  if ( $line = m/$regex/ ) {
  }
}


3.
Du wendest Deine Suche auf jede Zeile an, d.h. Du kriegst für jede Zeile eine Ausgabe, ob der/die Suchstrings gefunden wurden, oder nicht.

4.
Dein Vergleich ist eine Zuweisung (=), noch nicht einmal ein numerischer Vergleich (==), das kann so nicht funktionieren.
Wenn die Strings identisch sein sollen, musst Du lexikalisch vergleichen (eq).

Wenn Du ein Vorkommen prüfen willst, solltest Du index() verwenden:
Code (perl): (dl )
1
2
3
if ( index( $line, $suche, 0 ) >= 0 ) {
  # suche gefunden
}


[edit] Punkt 4. korrigiert.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
GwenDragon
 2007-10-15 13:45
#100829 #100829
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Mal ne Frage: Wieso postest du immer wieder denselben Beitrag "Zeichenkette in Datei suchen" hier neu?
Ein Versehen?
pktm
 2007-10-15 13:52
#100831 #100831
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja so auf anhieb würde ich sagen, benutze mal use strict; und use warnings; auf dass deine Variablen einen Gültigkeitsbereich erhalten und du Fehler jetzt und zukünftig immer schnell findest :)

Dann hast du das = als Vergleichsoperator verwendet. Das ist aber der Zuweisungsoperatur ($x = 5; # weise $x den Wert 5 zu). Gemeckert wird darüber nicht viel (glaube ich), weil du kein strict und warnings an hast. Um Zeichenketten zu vergleichen musst du den Operator eq benutzen (if( "abc" eq "abc" ) { ... }), ne prüft auf ungleichheit.
Bei Zahlen hingegen gibt es == und != als Vergleichsoperatoren.

Um dir zu merken, ob du etwas gefunden hast kannst du eine Variable my $gefunden = 0; vor der Schleife deklarieren, die du innerhalb deiner if-Abfragen auf 1 setzt, wenn du etwas findest. Wenn dann nämlihc nichts gefunden wird ist die immernoch 0 und du kannst das dann abfragen (mit if( $gefunden == 0) { .. }).

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2007-10-15 14:18
#100837 #100837
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
GwenDragon+2007-10-15 11:45:11--
Mal ne Frage: Wieso postest du immer wieder denselben Beitrag "Zeichenkette in Datei suchen" hier neu?
Ein Versehen?

nein, das passiert mehreren leuten, haben wir doch schon zig mal durchgekaut.
es passiert wegen dem fehlenden redirect nach dem posten. der user postet den thread
und sieht nach dem POST den thread dargestellt. dann klickt er nach ner weile auf reload, um
zu schauen, ob antworten da sind. dadurch wird der thread *erneut* gepostet, aber
der user merkt es nicht, da er den neuen thread sieht und denkt, er habe noch keine
antworten.
dieses szenario wurde auch schon so von einem user bestätigt.
einfache lösung wäre (wie es auch bei antworten auf threads ist), nach
dem POST kommt ein redirect auf den thread, so dass ein reload eben nicht
nochmal die aktion ausführt.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
dschingis
 2007-10-19 13:56
#101102 #101102
User since
2007-10-15
5 Artikel
BenutzerIn
[default_avatar]
OK, erstmal ein Sorry an alle, es sollte nicht mehrfach gepostet werden ... lag wohl an meinem reload.

Dann ein Danke an alle für die Tipps, ich werde sie mir im Detail anschaun und versuchen um zu setzen.

Alles in allem kann ich nur ein Lob für Eure schnelle und konstruktive zuarbeit aussprechen. DANKE!!!

Gruß
Dschingis
<< >> 7 Einträge, 1 Seite



View all threads created 2007-10-15 12:58.