Eine bessere Möglichkeit, nach einer Zeichenfolge in einer Datei zu suchen?

3502
eleven81

Ich versuche, eine bestimmte Zeichenfolge in einer Datei irgendwo auf meiner Festplatte zu finden. Das Beste, was ich bisher gefunden habe, ist:

find -type f / | xargs cat | grep "string to find" 

Dies sagt mir aber nur, ob der String irgendwo existiert oder nicht.

Woher weiß ich, in welcher Datei ich sie gefunden habe?

Gibt es einen besseren Weg?

0

6 Antworten auf die Frage

5
DrFredEdison

Das sollte den Trick tun und ist viel einfacher:

grep -R "some string" / 

Durch Hinzufügen von -n werden die Zeilennummern angezeigt, die Sie benötigen:

grep -Rn "some string" / 
4
John T
find / -type f -exec grep "string" {} + 

Dadurch wird eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durchgeführt, die langsamer, aber flexibler ist:

find / -type f -exec grep -i "string" {} + 

Sie erhalten möglicherweise eine Menge Ergebnisse, so dass Sie sie auf weniger reduzieren können und dann mit fund bdurch die Ausgabe vorwärts und rückwärts navigieren können:

find / -type f -exec grep -i "string" {} + | less 

Wenn Sie wissen, dass Sie nach *.txtDateien suchen, können Sie diese noch weiter verfeinern:

find / -type f -name "*.txt" -exec grep -i "string" {} + | less 
4
davr

Warum in diesem Fall überhaupt 'Katze' verwenden? Ich finde es immer merkwürdig, wie Menschen "Katze" ohne Grund verwenden. Mach einfach:

find -type f / | xargs grep "string to find" 

Die Suche nach jeder einzelnen Datei auf Ihrer gesamten Festplatte ist natürlich ziemlich langsam. Es ist wahrscheinlich besser, ein Indexierungsprogramm zu verwenden, wenn Sie häufig so suchen müssen. Zum Beispiel ist Beagle eine ziemlich umfangreiche Suchmaschine, die es schon eine Weile gibt. Andere Optionen sind KDE's Strigi oder Google Desktop Search

Zumindest sollten Sie 'locate' anstelle von 'find' verwenden, es werden nur Dateinamen und nicht deren Inhalt indiziert, aber das beschleunigt trotzdem. Außerdem sollten Sie vor dem Einsatz von grep nach Dateityp filtern. Beispielsweise ist die Verwendung von grep für eine 100-MB-Avi-Datei oder so etwas nur Zeitverschwendung.

2
akira

wie wäre es mit:

grep -r -H -i 'string' . 
2
nik

Woher weiß ich, in welcher Datei ich sie gefunden habe?

Sie müssen die -HOption ' grep' mit ' ' zum Drucken der entsprechenden Datei verwenden.


Ebenfalls,

  • Es wäre auch eine gute Idee, eine etwas bessere Vermutung als die Wurzel (' /') zu verwenden.
  • JohnDas Schema der -execUmschaltung des |Operators ' ' hilft, wenn viele Dateien durchsucht werden
+1 - Sie sollten fast * nie * eine Suche bei `/` beginnen. Es lohnt sich auch zu sagen, dass, wenn Sie eine Suche starten, die von `/` als normaler Benutzer ausgeht, am Ende eine Menge Fehlermeldungen aufgrund von Berechtigungsproblemen auftreten. Telemachus vor 14 Jahren 3
grep -H würde in diesem Fall aufgrund seines überflüssigen Einsatzes von 'cat' nicht funktionieren. es würde nur "stdin" drucken. Wenn er jetzt nicht 'cat' verwendet, ist die Standardeinstellung von grep, die Datei auszudrucken, in die er passt, damit er keine zusätzliche Markierung benötigt. davr vor 14 Jahren 2
1
Lee B

Ja, grep mit dem Flag -r sucht rekursiv. Versuchen Sie einen Befehl wie:

grep -ri 'hello' . 

Hier wird das aktuelle Verzeichnis und alle darin enthaltenen Dateien und Verzeichnisse nach dem Begriff "Hallo" durchsucht. Die -i-Markierung macht es case-unabhängig, so dass es auch "Hallo", "Hallo" usw. findet.