# grep frage

## CommanderHammilton

hallo, ich habe ein kleines probl.

ich habe in einem ordner etwa 30.000 txt datein. es kommt in unterschiedlichen datein eine zeichenkette vor 

CK-MB

ich möchte nun alle datein durchsuchen und da wo in einer datei die zeile CK-MB vorkommt diese zeile vollständig auslesen und in einer weiteren datei schreiben. bei weiteren gefundenen werten sollen diese dann einfach an die ausgabe datei unten drangehängt werden.

ich hoffe auf eine schnelle hilfe  :Smile:   :Rolling Eyes:   :Rolling Eyes: 

zur info so sieht ein entsprechender eintrag aus: 

OBX|17|ST|0^CK-MB (CPU)||folgt|U/l|||||I|

----------

## franzf

```
for i in *; do grep CK-MB $i >> found_match; done
```

sollte klappen.

----------

## CommanderHammilton

vielen DANK!, aber er schreibt nun auch in die datei strings welche nicht den gewünschten suchstring CK-MB enthalten  :Sad: 

OBX|2|NM|1501^Creatinin im Spontanurin||176.07|mg/dl|||||F|1300||||||||200712051614| --<falsch

OBX|1|ST|1608^CK-MB||folgt|U/l|||||I|02300|||||||200712051000||||||||20071205121614| --< richtig

----------

## franzf

 *CommanderHammilton wrote:*   

> vielen DANK!, aber er scrheibt nun auch in die datei strings welche nicht den gewünschten suchstring CK-MB enthalten 

 

Hast du ein Beispiel?

----------

## CommanderHammilton

OBX|2|NM|1501^Creatinin im Spontanurin||176.07|mg/dl|||||F|1300||||||||200712051614| --<falsch

OBX|1|ST|1608^CK-MB||folgt|U/l|||||I|02300|||||||200712051000||||||||20071205121614| --< richtig

----------

## firefly

 *CommanderHammilton wrote:*   

> OBX|2|NM|1501^Creatinin im Spontanurin||176.07|mg/dl|||||F|1300||||||||200712051614| --<falsch
> 
> OBX|1|ST|1608^CK-MB||folgt|U/l|||||I|02300|||||||200712051000||||||||20071205121614| --< richtig

 

also ich habe beide strings in die selbe datei gepackt und das ergebnis is wie folgt:

```
$ grep CK-MB *

test.txt:OBX|1|ST|1608^CK-MB||folgt|U/l|||||I|02300|||||||200712051000||||||||20071205121614
```

auch wenn die beiden strings in separaten Dateien sind bekomme ich nur obiges Ergebnis.

Also zeig mal wie du den befehl ausführst.

----------

## franzf

Ich hab mir die beiden Zeilen mal in eine Datei kopiert. Ein grep (wie der von mir gepostete) gibt genau die eine Zeile aus welche von dir als korrekt bezeichnet wurde.

Kann es sein dass da irgendwie kein Zeilenumbruch ist bzw. die Zeile noch zu einer Zeile mit Suchergebnis gehört?

Ansonsten kannst du mal den Suchstring (CK-MB) in Anführungszeichen setzen - sollte aber eigentlich wurscht sein  :Wink: 

Oder kann es sein dass diese Zeile(n) noch von einem deiner früheren Versuche stammt?

----------

## CommanderHammilton

for i in *; do grep CK-MB $i >> found_match; done

----------

## CommanderHammilton

besteht mit grep die moglichkeit wenn er CK-MB findet, die ersten 4 stellen vor und danach auszugeben und diese dann entsprechend in die found auszugeben ?

----------

## firefly

 *CommanderHammilton wrote:*   

> besteht mit grep die moglichkeit wenn er CK-MB findet, die ersten 4 stellen vor und danach auszugeben und diese dann entsprechend in die found auszugeben ?

 

man grep  :Wink: 

----------

## Necoro

 *firefly wrote:*   

>  *CommanderHammilton wrote:*   besteht mit grep die moglichkeit wenn er CK-MB findet, die ersten 4 stellen vor und danach auszugeben und diese dann entsprechend in die found auszugeben ? 
> 
> man grep 

 

info grep ist ein wenig aufschlussreicher ...  :Smile: 

----------

## think4urs11

 *firefly wrote:*   

> man grep 

  *Necoro wrote:*   

> info grep ist ein wenig aufschlussreicher ... 

 

herummäkel beides auch nichts weiter als ein freundlich verpacktes RTFM  :Wink: 

 *CommanderHammilton wrote:*   

> besteht mit grep die moglichkeit wenn er CK-MB findet, die ersten 4 stellen vor und danach auszugeben und diese dann entsprechend in die found auszugeben ?

 

Ich nehme mal an du meinst nicht 4 Stellen sondern 4 Zeilen? In letzterem Fall den obigen RTFMs folgen und vor allem die ersten vier Optionen in der manpage beachten

----------

## Qubit

Hi,

probier mal folgendes:

```
grep -w 'CK-MB' * >>./match
```

Gruß Daniel

----------

## CommanderHammilton

das war die lösung die ich gesucht hatte:

for $i in *; do grep "[0-9]*<backslash>^CK-MB" $i; done; | sort |uniq

danke für eure hilfe

----------

## toralf

 *CommanderHammilton wrote:*   

> for $i in *; do grep "[0-9]*<backslash>^CK-MB" $i; done; | sort |uniq

 Einfacher und schneller ist's mit 

```
grep -h "[0-9]*<backslash>^CK-MB" *| sort -u
```

----------

## Anarcho

 *toralf wrote:*   

>  *CommanderHammilton wrote:*   for $i in *; do grep "[0-9]*<backslash>^CK-MB" $i; done; | sort |uniq Einfacher und schneller ist's mit 
> 
> ```
> grep -h "[0-9]*<backslash>^CK-MB" *| sort -u
> ```
> ...

 

Bei 30.000 Dateien dürfte die bash damit gewisse probleme haben ....

EDIT: Obwohl es in der FOR Schleife auch funktioniert... Wo lag doch gleich die Grenze bei der Anzahl der Parameter?

----------

## toralf

 *Anarcho wrote:*   

> EDIT: Obwohl es in der FOR Schleife auch funktioniert... Wo lag doch gleich die Grenze bei der Anzahl der Parameter?

 In etwa bei 2^15 Bytes macht die Kommandozeile dicke Backen - also ist xargs die Alternative, die der for Schleife _unbedingt_ vorzuziehen ist bei 30000 files.

----------

## Necoro

Oder man macht

grep -R $SUCH_RE .

 - durchsucht also das Verzeichnis einfach rekursiv  :Smile: 

----------

