fisi-azubi2010
Goto Top

Mit grep und regulärem Ausdruck zeilen Ausgeben mit bestimmten Zeichenmuster

Dieser Beitrag beschäftigt sich mit einem regulären Ausdruck zum finden bestimmter Zeichenmuster innerhalb einer Datei auf einem Unix-System. Hierzu wird der Befehl grep verwendet

Hallo Admingemeinde,

zur Zeit bin ich in einer Abteilung die sich stark mit Unix und dessen Derivaten beschäftigt. Damit ich Unix Fit gemacht werde soll ich einige Aufgaben lösen was bisher auch ganz gut geklappt hat. Nun bin ich an einer Aufgabe wo weder Manpages, die Kollegen um mich rum oder mehrere Suchanfragen bei meinem Freund Google helfen können. Wir sitzen zu dritt seit Stunden an dieser Aufgabe. Deshalb wende ich mich ich mich hier an dieses Forum. Wie der Titel schon sagt geht es um Zeichenmuster das mit grep und regulärem Ausdruck aus einer Datei gelesen werden soll.

Die Situation und Aufgabenstellung etwas genauer Erörtert:

- Es existiert eine Datei die mit Vornamen gefüllt ist
- 2 Azubis und ein ausgelernter FISI denen nichts mehr einfällt und der jenige ders könnte ist die nächsten 3Wochen nicht da

Die Aufgabe lautet nun die Vornamen auszugeben:

- die das Zeichen "a" und "b" in Groß- Kleinschreibung enthalten

also

z.B A oder B am Anfang und ein "a" und ein"b" irgentwo im weiteren verlauf der Zeile

Barbara oder Abdelbahi wären z.B. solche Strings


Was haben wir z.B versucht:

grep -E "[AB] [ab]" Dateiname

Vieleicht hat hier jemand einen Ausdruck der diese Kriterien erfüllt oder kann uns auf den richtigen Weg bringen.

Danke im voraus und Gruß

FISI-AZUBI2010

Content-ID: 114319

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

Ausgedruckt am: 25.11.2024 um 00:11 Uhr

godlie
godlie 21.04.2009 um 12:11:35 Uhr
Goto Top
Hallo

grep [abAB] test.txt

sucht nach a,b,A,B in der Datei oder hab ich an der Aufgabenstellung was aflsch ausgelegt
FISI-Azubi2010
FISI-Azubi2010 21.04.2009 um 12:27:10 Uhr
Goto Top
Hi godlie,

Danke für deine Antwort aber diese Zeile würde alle ausgeben die am Anfang mit a A oder b B beginnen.

Das ist aber nur eins der in der Aufgabenstellung geforderten Kriterien.

Es soll nach dem Anfangsbuchstaben irgentwo im Verlauf der Zeile noch mal ein a und auch irgentwo ein b stehen.


Diese Aufgabe macht mich noch wahnsinnig das ist richtig was zum Knobeln

Ich hab auch schon versucht das ganze mit Pipes zu realisieren da man ja mit Pipes immer ne UND-Bedingung hinbekommt aber selbst damit ists noch kompliziert
godlie
godlie 21.04.2009 um 12:37:58 Uhr
Goto Top
Also:

grep ^A.*a sucht alles was A am Anfang hat und ein a enthält
grep ^B.*b sucht alles was B am Anfang hat und ein b enthält.

wie wärs mit der Lösung
77559
77559 21.04.2009 um 12:38:48 Uhr
Goto Top
Es gibt im internet eine ganze Menge Hilfe-Seiten rund um Regular Expressions.
Leider gibt es auch einige verschiedene Dialekte.

Grundsätzlich gibt es die Anker "^" für den Zeilenanfang und "$" fürs Zeilenende.
Der Punkt steht für ein beliebiges Zeichen und der Asterisk * für eine beliebige Anzahl des vorherigen Elements.

Wenn Ihr also pro Zeile nur einen Namen habt, ist das Ganze recht einfach.

Gruß
LotPings
godlie
godlie 21.04.2009 um 12:59:44 Uhr
Goto Top
Sodala jetzt ist das ding fertig.

grep -E "^A.+a|^B.+b" test.txt  

Aber darauf könnte man kommen wenn man mal in eine man page von grep oder egrep reinschaut.
Dort sind nämlich die Regular Expressions kurz erklärt.

edit:
Achja das ganze hat mit Kaffeetrinken nicht mal 30minuten gedauert.
77559
77559 21.04.2009 um 13:15:12 Uhr
Goto Top
Hallo godie,

dann hat aber das Kaffee trinken zuviel Anteil gehabt face-wink

deine RegExp findet z.Bspw nicht den Aaron oder die Bertha.

Immer noch von einem Namen ohne Leerzeichen pro Zeile ausgehend
grep -E "^[AB].*[ab].*$" test.txt
Aber das haben Die OPs inzwische bestimmt selber herausgefunden.
godlie
godlie 21.04.2009 um 13:25:06 Uhr
Goto Top
Hm da war dann doch ncoh ein Denkfehler face-smile
FISI-Azubi2010
FISI-Azubi2010 21.04.2009 um 15:38:10 Uhr
Goto Top
Hi und danke für die Antworten,

wir haben jetzt das ganze über mehrere Pipes gelöst ist zwar nicht schön aber es funktioniert erstmal. ; )
Dennoch wäre es cool zu wissen wie man das als regular expression macht.

Gruß FISI-AZUBI2010
FISI-Azubi2010
FISI-Azubi2010 21.04.2009 um 15:57:14 Uhr
Goto Top
Zitat von @77559:
Hallo godie,

dann hat aber das Kaffee trinken zuviel Anteil gehabt face-wink

deine RegExp findet z.Bspw nicht den Aaron oder die Bertha.

Immer noch von einem Namen ohne Leerzeichen pro Zeile ausgehend
> grep -E "^[AB].*[ab].*$" test.txt
> 
Aber das haben Die OPs inzwische bestimmt selber herausgefunden.

ähm Aaron und Bertha entsprechen ebenfalls nicht den Kriterien da sie "b" im weiteren verlauf der Zeile nicht haben

Es muss am Anfang ein A oder ein B sein und dann im verlauf ein "a" und ein "b"
77559
77559 21.04.2009 um 16:39:12 Uhr
Goto Top
Zitat von @FISI-Azubi2010:
ähm Aaron und Bertha entsprechen ebenfalls nicht den Kriterien
da sie "b" im weiteren verlauf der Zeile nicht haben

Es muss am Anfang ein A oder ein B sein und dann im verlauf ein
"a" und ein "b"


Jaja, immer diese Schlauberger die selber nicht richtig lesen können face-wink

c:\>type Namensliste.txt
Abraham
Barbara
Abdelbahi
Aaron
Beathe
Bertha
Rainer
Sigismund
Habakuk

c:\>grep -E "^[AB].*((a.*b)|(b.*a)).*$" Namensliste.txt
Abraham
Barbara
Abdelbahi

Bei meinem Grep (WindowsPort) funktioniert das so.

Gruß
FISI-Azubi2010
FISI-Azubi2010 23.04.2009 um 13:17:37 Uhr
Goto Top
Hi Lotpings,

dein Ausdruck funktiniert danke
So Problem gelöst.

Die Lösung ist grep -E "^[AB].*((a.*b)|(b.*a)).*$" Dateiname