grep OR und AND

  • Ersteller Steppengewächs
  • Erstellt am
Steppengewächs

Steppengewächs

Jungspund
Hallo Leute!

Ich benötige wieder mal ein kleine Hilfe bei einem Befehl! :hilfe2:

Und zwar rede ich nicht lange um den heißen Brei herum, derzeit habe ich diesen Befehl hier:

Code:
egrep "Oct.*Syntax error" * -R

Liefert mir dann alle Zeilen mit "Oct" UND "Syntax error", ich möchte nun alle Einträge mit "Aug" ODER "Oct" UND "Syntax error" finden, ein OR mache ich bei grep ja normal mit Pipe | ich hab jetzt folgendes versucht:

Code:
egrep "(Aug|Oct).*Syntax error" * -R
egrep "[Aug|Oct].*Syntax error" * -R
egrep "Aug|Oct.*Syntax error" * -R

Klappt aber leider alles nicht. :headup:
Hat von euch jemand einen Tipp für mich wie ich das realisieren kann?

Danke!!!

schönes Wochenende Jungs und Mädels!
 
Vielleicht

Code:
egrep "[Aug*|Oct*].*Syntax error" * -R

cu
 
Vielleicht

Code:
egrep "[Aug*|Oct*].*Syntax error" * -R

cu

Ein zweites mal das du mir hilfst! :) thx

Aber leider kriege ich hier alle Einträge in denen "Syntax error" vorkommt, auch die Einträge in denen kein "Aug" oder "Oct" vorkommt, sprich auch die vom Juli.
 
Meine Datei test.txt:
Jun test1 test2 test3 Syntax error
Jul test1 test2 test3 Syntax error
Aug test1 test2 test3 Syntax error
Oct test1 test2 test3 Syntax error
Nov test1 test2 test3 Syntax error
Dez test1 test2 test3 Syntax error

Ausgabe:

bart:~ # egrep "[Aug*|Oct*].*Syntax error" test.txt -R
Jun test1 test2 test3 Syntax error
Jul test1 test2 test3 Syntax error
Aug test1 test2 test3 Syntax error
Oct test1 test2 test3 Syntax error
Nov test1 test2 test3 Syntax error
Dez test1 test2 test3 Syntax error
 
Code:
 egrep "(Aug)|(Oct).*Syntax error" test.txt -R

So geht's.
 
Ja, stimmt :D

hatte mir was anderes vorgestellt.

aber die letztgenannte Zeile funktioniert ebenfalls, zumindest hier :think:

Code:
egrep "Aug|Oct.*Syntax error" * -R
Aug test1 test2 test3 Syntax error
Oct test1 test2 test3 Syntax error

cu
 
Zuletzt bearbeitet:
Code:
 egrep "(Aug)|(Oct).*Syntax error" test.txt -R

So geht's.

Leider nicht :(

Testdatei:
Code:
Jun test1 test2 test3 Syntax error
Jun alles ruhig
Jul test1 test2 test3 Syntax error
Jul alles ruhig
Aug test1 test2 test3 Syntax error
Aug alles ruhig
Oct test1 test2 test3 Syntax error
Oct alles ruhig
Nov test1 test2 test3 Syntax error
Nov alles ruhig
Dez test1 test2 test3 Syntax error
Dez alles ruhig

Ausgabe:

Code:
bart:~ # egrep "(Aug)|(Oct).*Syntax error" test.txt -R
Aug test1 test2 test3 Syntax error
Aug alles ruhig
Oct test1 test2 test3 Syntax error
 
FFS,

jetzt aber:

Code:
egrep "((Aug)|(Oct))(.*)Syntax error" fooo -R

gibt mir:

Code:
Aug test1 test2 test3 Syntax error
Oct test1 test2 test3 Syntax error

Durch die fehlende Klammerung vorher wurde das OR auf den Rest des Ausdrucks angewandt.

Merke: Lieber eine Klammer zuviel bei Regexes als eine zuwenig....:)
 
Super danke, ja jetzt klappt es wunderbar! :D

Dank dir, wünsch dir ein schönes WE!!
 
Code:
egrep "((Aug)|(Oct))(.*)Syntax error"
Sollte äquivalent sein mit dem ersten Versuch des Threaderstellers:
Code:
egrep "(Aug|Oct).*Syntax error"
Die Alternation (|) hat eine so niedrige Precendence, dass die Klammern um Aug und Oct überflüssig sind.
Sprich
Code:
/foo|bar/
entspricht
Code:
/(foo)|(bar)/
und nicht
Code:
/fo(o|b)ar/
Den Sinn Klammer um .* versteh ich sowieso nicht, aber naja..
Und Slackfan,
Code:
[Aug*|Oct*]
matcht exakt ein Zeichen, das ist eine charclass. Äquivalent¹ zu:
Code:
[AOugct*|]

Last but not least: "dot star" sollte man möglichst nur wenns wirklich nicht anders geht verwenden, weils einfach alles matcht.
Schönes sinnfreies Rumgerate ansonsten.

ad 1: ich will irgendwie immer equivalent schreiben. Wahrscheinlich bin ich schon verdenglischt..
 
Ups, sollte natürlich "den Sinn der Klammer um..." heißen.
Weiter im Text:
Code:
$ echo foofa|egrep '(.)(.)\2\1a'
foofa
Wie du siehst werden Klammerungen gespeichert. Ein Grund dagegen. Besser lesbar find ichs jetzt auch nicht. Kann man eventuell im Zweifelsfall benutzen, wenn die Precendence nicht völlig klar ist, so könnte man deinen ersten Versuch zur Illustration statt so
Code:
(Aug)|(Oct).*Syntax error
einfach so schreiben:
Code:
(Aug)|(Oct.*Syntax error)
Da würde einem dann auch der Fehler gleich ins Auge fallen. Ansonsten sind Klammern imho nur dafür gut backreferences zu erzeugen oder eine bestimmte (nicht default) precendence zu erzwingen. Aber hast schon recht.
(Sorry, nicht persönlich nehmen, aber wenn ich den Spruch nur höre...)
 
Das war doch nicht sinnfrei. Es war maximal nicht zweckdienlich. Ich habe nämlich dabei etwas gelernt und genau das ist der einzige Grund, wieso ich mich hier überhaupt herumtreibe. Danke für deine Erörterungen.
 
Aber hast schon recht.
(Sorry, nicht persönlich nehmen, aber wenn ich den Spruch nur höre...)

Auch wenn das völlig OT ist:

Sorry, ebenfalls nicht persönlich nehmen, aber wenn ich deine Antwort so lese, solltest du vielleicht mal recherchieren, woher dieser Spruch eigentlich kommt.

Aber immer gleich die dicke Nazi-Keule auspacken.......
 
Zurück
Oben