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.