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?


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" * 

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

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 :)


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.