Warum funktioniert grep Befehl mit * nicht?
Angenommen ich bin in einem Ordner mit mehreren Dateien. Wenn ich grep mit find verknuepfe also zB: find | grep c Dann findet es alle Dateien wo ein c drin vorkommt. Warum zeigt es mir bei find | grep *c nichts an, der * sollte ja bedeuten, dass es egal ist was vorher steht.
Und wenn ich einen Punkt davor mache zB: find | grep .c zeigt es mir auch alle Dateien an wo c drin vorkommt, warum? Ein Punkt bedeutet ja, dass nur EIN beliebiges Zeichen statt dem stehen darf oder?
5 Antworten
Das kommt sehr darauf an, welche Syntax du verwenden willst!
Aber völlig davon abgesehen, interpretiert die Shell ein * mit besonderer Bedeutung, du musst den Ausdruck also in Anführungszeichen setzen.
Und außerdem musst du vor den Stern einen Punkt setzen, da das Muster sonst fehlerhaft ist.
Außerdem bin ich mir nicht sicher, was du eigentlich erreichen willst. Möchtest du alle Dateien ausgeben, die mit ".c" enden?
Wenn ja
find | grep '\.c$'
... das findet alle Dateien, mit der Endung ".c", wobei das Dollarzeichen für das Ende steht. :)
Wie es aussieht, hast du regex und vielleicht auch grep falsch verstanden. Ein Sternchen heißt in regex nicht, dass da etwas beliebiges stehen darf, sondern dass das davor stehende Zeichen beliebig oft vorkommen kann/muss. Ein Sternchen als Anfang des regex Ausdrucks ist also gar nicht gültig. "egal was" wäre daher ".*"
Grep durchsucht alle Zeilen anhand der angegebenen regex. Wenn du nur nach ".c" suchst, gibt es dir alle Zeilen aus, die ein C enthalten und mindestens ein Zeichen davor haben. An welcher Stelle in der Zeile diese Zeichen sind ist egal, wenn die regex es nicht vorschreibt (mit ^ oder $).
Hallo
zB: find | grep c
Das ist schon unsinnig, denn gerade in Verbindung mit find bietet sich exec an statt einer Pipe:
find . -iname "*c" -exec grep -iH '*c' {} \; 2>/dev/null
der * sollte ja bedeuten, dass es egal ist was vorher steht.
Das hängt davon ab welche Syntax Du benutzt. Unter Umständen musst Du auch egrep verwenden (egrep oder grep -E) Der Asterisk steht normalerweise für beliebig viele Zeichen und nicht für "egal".
Aber erkläre doch mal was das Ziel genau ist, bestimmt findet sich eine relativ einfache Lösung.
Linuxhase
Wenn Du .c-Dateien suchst, kannst Du auch ohne grep suchen:
find . -name "*.c"
Du musst das Sternchen escapen:
find bla | grep \*c
cheers | barnim