[FRAGE] grep ZEICHENFOLGE1 und ZEICHENFOLGE2 in EINER Zeile

Plage

Well-Known Member
IST:
Code:
cat datei | grep -Ei 'ZEICHENFOLGE1' > datei2 
cat datei2 | grep -Ei 'ZEICHENFOLGE2' > datei3

SOLL:
grep ZEICHENFOLGE1 und ZEICHENFOLGE2 die ZUSAMMEN IN EINER ZEILE VORKOMMEN
ich will halt alles nur einmal mit grep starten. hab auch schon die wildesten kombinationen probiert und natürlich suchmaschinen gequält.

hat einer ne idee?
 
Code:
grep ZEICHENFOLGE1 datei1 | grep ZEICHENFOLGE2 > datei3

grüße
 
Zuletzt bearbeitet:
Doch, aber das ist dann deutlich aufwändiger. Es sei denn die Zeichenfolgen tauchen in einer festen Reihenfolge auf.
 
IST:
Code:
cat datei | grep -Ei 'ZEICHENFOLGE1' > datei2 
cat datei2 | grep -Ei 'ZEICHENFOLGE2' > datei3

SOLL:
grep ZEICHENFOLGE1 und ZEICHENFOLGE2 die ZUSAMMEN IN EINER ZEILE VORKOMMEN
ich will halt alles nur einmal mit grep starten. hab auch schon die wildesten kombinationen probiert und natürlich suchmaschinen gequält.

hat einer ne idee?

Sowas hier?

Code:
awk '(x = tolower($0)) && x ~ /foo/ && x ~ /bar/'

Die Regexps (foo und bar im Beispiel) sollten dann natuerlich konsequent Kleinbuchstaben verwenden, sonst geht's in die Hose.

Uebrigens: mal von dem unnoetigen Umweg ueber eine separate Datei (statt Pipes zu nehmen) handelt es sich bei Deinem urspruenglichen Schnippsel auch um useless use of cat(1). Tools wie grep(1), awk(1), sort(1) etc. schlucken beliebig viele Dateinamen in der Kommandozeile. Nervige Ausnahme ist dabei allerdings tr(1).
 
wie wäre
Code:
grep 'zeichenfolge1.*zeichenfolge2' datei
?

Der OP schreibt doch extra, dass die Reihenfolge beiliebig ist. Und wenn man es wirklich generisch haben will, dann koennten sie die Regexps ja auch ueberlappen, da kommt man dann noch nicht mal mehr mit 're1.*re2|re2.*re1' aus.
 
Sowas hier?

Code:
awk '(x = tolower($0)) && x ~ /foo/ && x ~ /bar/'

Die Regexps (foo und bar im Beispiel) sollten dann natuerlich konsequent Kleinbuchstaben verwenden, sonst geht's in die Hose.
super, das funktioniert. mit der groß/kleinschreibung wird das zwar schwierig, aber da finde ich bestimmt noch was.

Uebrigens: mal von dem unnoetigen Umweg ueber eine separate Datei (statt Pipes zu nehmen) handelt es sich bei Deinem urspruenglichen Schnippsel auch um useless use of cat(1). Tools wie grep(1), awk(1), sort(1) etc. schlucken beliebig viele Dateinamen in der Kommandozeile. Nervige Ausnahme ist dabei allerdings tr(1).
ja, wenn man erstmal andere beispiele sieht, fragt man sich schon warum nicht gleich so.

wie wäre
PHP:
grep 'zeichenfolge1.*zeichenfolge2' datei
?
das funktioniert zwar auch, nur darf dann in 'datei' nicht zeichenfolge2 vor der zeichenfolge1 stehen.
 
Zuletzt bearbeitet:
super, das funktioniert. mit der groß/kleinschreibung wird das zwar schwierig, aber da finde ich bestimmt noch was.

Regexps in awk(1) muessen nicht konstant sein, sondern koennen auch in Variablen stehen, das ist dann bloss etwas langsamer. Wenn die Regexps also von aussen beigesteuert werden, kansst Du sie in einer BEGIN-Rule mit tolower() ebenfalls in Kleinbuchstaben zwingen und dann die entsprechenden Variablen verwenden. Beispiel:

Code:
awk 'BEGIN{ foo=tolower("FOO"); bar=tolower("BAR")}{x=tolower($0)) && x ~ foo && x ~ bar'

Modulo Tippfehlern (ich hab's einfach nur hier reingetippert und nicht ausprobiert). Einfach mal awk(1) lesen, das sind weniger als 400 Zeilen Doku und tut nicht weh. Da steht auch drin, wie man die Suchbegriffe von aussen an ein awk-Script uebergeben kann.
 
Zurück
Oben