Dateiname und Zeilennummer in der Grep-Ausgabe anzeigen

85

Ich versuche mein Rails-Verzeichnis mit grep zu durchsuchen. Ich suche nach einem bestimmten Wort und möchte grep, um den Dateinamen und die Zeilennummer auszudrucken.

Gibt es eine Grep-Flagge, die dies für mich erledigt? Ich habe versucht, eine Kombination aus -nund zu verwenden, -laber diese drucken entweder die Dateinamen ohne Nummern aus oder geben einfach viel Text an das Terminal aus, der nicht leicht zu lesen ist.

Ex:

  grep -ln "search" *

Muss ich es auf awk leiten?

trev9065
quelle

Antworten:

135

Ich denke, es -list zu restriktiv, da es die Ausgabe von unterdrückt -n. Ich würde vorschlagen -H( --with-filename): Drucken Sie den Dateinamen für jede Übereinstimmung.

grep -Hn "search" *

Wenn dies zu viel Ausgabe ergibt, versuchen Sie -o, nur den passenden Teil zu drucken.

grep -nHo "search" * 
Speichen
quelle
Diese Antwort hat auch für mich geklappt. Ich musste rekursiv suchen und verwendete diesen Beispielbefehl: grep -Hnor "localhost". Diese Liste enthält alle Übereinstimmungen mit Dateiname und Zeilennummer, kurz und prägnant.
Tore Aurstad
Dies zeigt auch das Ergebnis und nicht nur den Dateinamen und die Zeilennummer an
bis zum
30
grep -rin searchstring * | cut -d: -f1-2

Dies würde bedeuten, rekursiv zu suchen ( searchstringin diesem Beispiel nach der Zeichenfolge ), Groß- und Kleinschreibung zu ignorieren und Zeilennummern anzuzeigen. Die Ausgabe von diesem grep sieht ungefähr so ​​aus:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

Als nächstes leiten wir dieses Ergebnis an den Befehl cut weiter, indem wir Doppelpunkt :als Feldtrennzeichen verwenden und die Felder 1 bis 2 anzeigen.

Wenn ich die Zeilennummern, die ich häufig verwende -f1(nur den Dateinamen und den Pfad), nicht benötige, leite ich die Ausgabe an weiter uniq, sodass ich jeden Dateinamen nur einmal sehe:

grep -ir searchstring * | cut -d: -f1 | uniq
JBW
quelle
1
Ich denke, dies beantwortet die ursprüngliche Frage am besten. Nur Dateinamen und Zeilennummern.
MastaBlasta
1
Beachten Sie, dass dies nicht funktioniert, wenn Sie absolute Pfadnamen von Windows wie "C: \ Users \ me \ git" haben, da dieser bereits einen Doppelpunkt enthält.
Hirse
17

Ich benutze gerne:

grep -niro 'searchstring' <path>

Aber das liegt nur daran, dass ich immer die anderen Wege vergesse und Robert de grep -niro aus irgendeinem Grund nicht vergessen kann :)

Bas van Ommen
quelle
Ich hätte nie gedacht, dass ich dafür Stimmen bekommen würde. Nur ein lustiger Anteil. Vielen Dank! (Aber es funktioniert wirklich - zumindest unter MacOS)
Bas van Ommen
Liebe deine Art, dich daran zu erinnern!
Greg Hilston
0

Der Kommentar von @ToreAurstad kann geschrieben werden grep -Horn 'search' ./, was leichter zu merken ist.

grep -HEroine 'search' ./ könnte auch funktionieren;)

Für Neugierige:

$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse
Ictus
quelle
0

So habe ich die hochgestufte Antwort verwendet, um einen Baum zu durchsuchen, um die fortran-Dateien zu finden, die eine Zeichenfolge enthalten:

find . -name "*.f" -exec grep -nHo the_string {} \;

Ohne das nHo erfahren Sie nur, dass eine Datei irgendwo mit der Zeichenfolge übereinstimmt.

Karl I.
quelle