PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : grep(EN) auf exacte übereinstimmung



meinereinerseiner
06-12-2001, 10:31
Hi,

mal eine Frage zu grep:
Wie kann ich in einer Datei nach einem String greppen, so das mir nur
ein Ergebnis gezeigt wird, wenn der String exact übereinstimmt und nicht nur ein teil davon?


der tom

Hans-Georg Normann
06-12-2001, 19:50
versuchen wir's mal so:

Eine folgender Bedingungen muß erfüllt sein:

Suchmuster ist von Leerzeichen eingeschlossen
Suchmuster beginnt mit Leerzeichen und steht am Zeilenende
Suchmuster steht am Zeilenanfang und endet mit Leerzeichen



grep "\ suchmuster\ " datei > /tmp/result.txt
grep "\ suchmuster$" datei >> /tmp/result.txt
grep "^suchmuster\ " datei >> /tmp/result.txt
cat /tmp/result.txt

Sollte eigentlich funktionieren. Ich würde dieses Aufgabe allerdings eher mit awk erledigen.

Hans

meinereinerseiner
06-12-2001, 21:04
danke erstmal, wie ginge es denn mit awk?

ich will, bevor ich eine datei mit sed bearbeite nachsehen ob ein bestimmter String vorhanden ist, also grep ein ergebnis liefert, ist dies nicht der fall soll eine FM ausgegeben werden.

der tom

Hans-Georg Normann
06-12-2001, 21:13
Erwischt!

Ich weiß daß es geht, aber ich weiß (noch) nicht wie! Es soll Bücher geben, welche sich ausschließlich mit awk beschäftigen. Vielleicht ist ein anderes Forenmitglied so nett, uns auf die Sprünge zu helfen.

Hans

Hans-Georg Normann
06-12-2001, 21:27
Lichtblitz!

Sehe gerade noch mal ganz verzweifelt in den Manpages von grep nach. Da sehe ich doch glatt zwei neue Operatoren die ich noch nicht kannte. Damit dürfte dann die Suche ziemlich einfach werden. Probier doch mal
grep "\\<suchmuster\\>" Datei:D :D :D :D

in diesem Sinne: RTM

Hans

thommy
07-12-2001, 08:22
Wenn Dein Suchmuster ein "Wort" ist, dann hilft Folgendes:

grep -qw Suchmuster <Datei> && sed ... <Datei>

'Suchmuster' wird als Wort erkannt, wenn es bspw. folgender Gestalt ist:

[TAB]Suchmuster[Leerzeichen]
(Suchmuster)
-Suchmuster!

Nicht jedoch in diesen Fällen:

1Suchmuster
Suchmuster_

Oder - kurzum- das Muster wird gefunden, wenn es nur die für Variablennamen zulässigen Zeichen enthält (1-9,_, a-z,A-Z).


Awk (http://www.linuxfibel.de/awk.htm) ist für die Anforderung nicht das Richtige (auch wenn's möglich ist).

Thomas

mightymike99
07-12-2001, 12:14
Hallo,

ich hab' da jetzt zwei verschiedene Fragestellungen herausgehoert:

a) Es soll nur ein komplett angegebenes Wort gefunden werden
( Bei Suche von "hals" wird nicht "halstuch" gefunden )
b) Es soll nur eine komplett mit dem Suchbegriff übereinstimmende Zeile gefunden werden

Bei beiden Sachen helfen dir regulaere Ausdruecke(RE)(erklaert auf: http://www.64-bit.de irgendwo, oder in der grep-manpage). Auf jeden Fall musst du wenn du RE's benutzt den egrep(extended grep) oder bei grep den Schalter -e verwenden.

Ein Problem von RE in der Shell ist der Schutz vor Interpretierung der ganzen Sonderzeichen. Der RE sollte auf jeden Fall in einfachen Hochkomma '...' oder doppelten(Variablensubstitution) "..." geschrieben sein. Dann kommt der Backslash dazu der auf jeden Fall verdoppelt werden muß da er in der Shell als einziges Zeichen seine Sonderfunktion(Aufhebung der Sonderfunktion des nächsten Zeichens) immer behält.

Dann ist also a) mit dem erwähnten grep -e "\<$suchmuster\>" Datei erledigt, wobei die Backslashes nur die Sonderfunktion der <,> Zeichen aufheben.

Der Fall b) erfordert die Angabe von diesen Zusicherungen:
^(Carret) ist Zeilenanfang
$ ist Zeilenende also:
grep -e "^$suchmuster\$"
Wichtig ist der Backslash vor dem 2. Dollarzeichen

Gruß
Tobias

BTW:
1. RE's können noch sehr sehr sehr viel mehr!
2. RE's werden in unterschiedlichen Umgebung nicht immer nach POSIX-Standard gehandhabt, unterscheiden sich also etwas
3. Es gibt ein kleines Shellprogramm das einem dabei hilft für viele(41) Umgebungen RE's zu erstellen heist txt2regex gibt's bei freshmeat.

meinereinerseiner
10-12-2001, 09:01
hmm, so ganz tut das irgendwie noch nicht,

vielleicht nochmal der Hintergrund:

also ich habe hier ein programm, was ca 12 verschidene config-files hat, in
welchen Passwoerter für das System stehen, welche in unregelmäßigen Abständen geändert werden muessen. nun ist genau das i.d. R. ganz schön nervig, alle 2-3 Wochen da die änderungen von hand zu machen. deswegen das script.

zur sicher heit sollte das script, bevor es die dateien anfäßt nachsehen ob das alte
PW auch in dieser vorhanden ist - und erst dann änderungen an dieser vornehmen.
der String hat dabei immer diese form: Password=OLD_PW


der tom

jgbauman
11-12-2001, 12:55
probier doch mal:
grep -e '^ *Password *= *'$OLD_PW' *$'

Du kannst die Leerzeichen* auch rausnehmen, wenn an den Stellen keine vorkommen dürfen/sollen.

meinereinerseiner
11-12-2001, 18:13
Hey - schick das ist,

das tut genau das was ich gesucht habe - many Thanks!

der tom

jgbauman
11-12-2001, 18:46
Original geschrieben von meinereinerseiner
Hey - schick das ist,

Zuviel star wars Du gesehen? ;-)

meinereinerseiner
11-12-2001, 21:09
wenn ich jetzt mal ehrlich bin - NEIN - kenne ich so gut wie
garnicht - aber momentan sagt das alle welt um mich rum - da schnappt mann sowas halt schonmal auf ;-)