grep -r funktioniert nicht unter Solaris

3

Wie kann ich unter Solaris rekursives grep ausführen?

Als ich es versuchte, erhielt ich folgende Fehlermeldung:

-r: invalid option.
Vikash Jindal
quelle

Antworten:

7

Rekursives grep unter Solaris:

find . -name "*.[chix]" | xargs grep -i -n pattern_to_search
Sandeep Singh
quelle
+1 Das benutze ich auch
Andy White
Das funktioniert nicht, wenn die Dateinamen Leerzeichen enthalten.
Tchrist
@tchrist In diesem Fall verwenden wir: find. -name "*. [chix]" | xargs grep -i -n "pattern_to_search"
es wird immer noch auf einige Dateinamen brechen. Der einzig sichere Weg, dies mit find und xargs zu tun, ist find. -Typ f -print0 | xargs -0 grep ...
2

find . | xargs grep whatsyrexpressionoder verwenden Sie cpan, um den ackBefehl zu installieren .

mkb
quelle
Ich wusste vorher nichts über ack. Vielen Dank.
Ubiyubix
Bricht bei Leerzeichen in Dateinamen ab.
1

Die Option -r für grep funktioniert nur mit gnu grep. Lösungen mit xargs sind gut, verursachen aber einige Probleme - find | xargs grep bricht bei Dateinamen mit Leerzeichen ab und außerdem ist xargs auch ein Gnu-Tool, sodass es möglicherweise nicht installiert ist.

Soweit ich weiß, ist der richtige Weg, dies unter Solaris zu tun:

find . -type f -exec grep ... {} +
  • am ende bedeutet, dass an jeden grep-aufruf viele dateien übergeben werden, so dass er relativ schnell ist.

Beachten Sie auch, dass solaris (naja, unix) grep (zum Beispiel) keine Option -E hat, und Sie sollten dafür verwenden egrep.


quelle
1

Wenn du Glück hast, hast du auch gnu grep installiert. Es wird dann " ggrep " genannt.

ggrep befindet sich normalerweise in, /usr/sfw/bin/ggrepwenn es installiert ist. Verwenden Sie die -H -R -IFlags: -Hum den Dateinamen anzuzeigen, -Rfür die rekursive Suche, -Ium Binärdateien zu ignorieren.

Beispiel: Alle Zeilen in allen Dateien mit Ausnahme von Binärdateien aus diesem Verzeichnis einschließlich aller Unterverzeichnisse mit dem Wort "excel" anzeigen

/usr/sfw/bin/ggrep -H -R -I "excel" *
thomasa88
quelle
0
find . -type f -exec grep hello {} /dev/null \;

Dies funktioniert auch für Dateinamen mit Leerzeichen. Warum / dev / null? Da jede grep-Instanz jeweils eine einzelne Datei überprüft und daher den Dateinamen nicht druckt, wenn eine Übereinstimmung gefunden wird. Das ist in Ordnung, wenn Sie wirklich nur eine einzelne Datei abrufen, aber es hilft nichts, wenn grep wiederholt von find aufgerufen wird. Das zusätzliche / dev / null dient als zusätzliche Dummy-Datei für die Suche, sodass grep dem aktuellen Dateinamen voranstellt, wenn die übereinstimmende Zeile gedruckt wird.

ubiyubix
quelle
Das ist eine sehr schlechte Idee, da es grep für jede Datei einzeln aufruft - was langsam bedeutet. sehr langsam.
Ich weiß. Eine Antwort schlug vor, xargs zu verwenden, das grep für mehrere Dateien gleichzeitig aufruft. Dies funktioniert jedoch nicht, wenn Dateinamen Leerzeichen enthalten. Eine Lösung funktioniert also nur für Dateinamen ohne Leerzeichen, die andere Lösung ist langsamer, funktioniert aber in diesem Fall. Vielen Dank für Ihre Bewertung
Ubiyubix
Nachdem ich Ihre Antwort gelesen habe, mag ich das "+".
Ubiyubix