Wie kann ich rekursiv Verzeichnisse nach einem Muster durchsuchen und einfach Dateinamen und Zeilennummern ausdrucken?

7

Derzeit verwende ich grep wie folgt:

grep -lr <PATTERN> .

Dies gibt mir die folgende Ausgabe, die eine Liste aller Dateien enthält, deren Inhalt (nicht Name) enthält:

./path/to/file1
./path/to/file2
...

Dies ist in Ordnung, aber es wäre nützlich, die Zeilennummern zu kennen. Die folgende Ausgabe wäre ideal, aber nachdem ich die Manpage für grep durchgesehen habe, kann ich anscheinend nicht die richtigen Schalter finden:

./path/to/file1 15, 22, 54
./path/to/file2 16, 17
...

Ist das mit grep oder einem anderen Tool möglich?

Rupert Madden-Abbott
quelle

Antworten:

5

ack macht standardmäßig etwas ähnliches. Sie können verwenden

$ ack blah
path/to/blah
16: blah blah
19: blah blah blah

path/to/more/blah
21: blahness

Wenn Sie nur die passenden Dateinamen möchten, können Sie sagen ack -l. ack -lcgibt Ihnen die Anzahl der Übereinstimmungen pro Datei.

Rohan Monga
quelle
2

Grep bietet die Möglichkeit, nur Dateinamen oder nur Dateinamen und Übereinstimmungszahlen oder übereinstimmende Zeilen (möglicherweise mit Dateinamen und Zeilennummern) zu drucken, jedoch nicht mehrere Übereinstimmungen in einer Zeile zu komprimieren.

Sie können die grep-Ausgabe filtern oder ein anderes Tool wie awk verwenden.

find . -type f -exec awk 'FNR==1 {if (found) print ""; found=0}
                          /PATTERN/ { if (!found) printf("%s", FILENAME);
                                      printf(" %d", FNR);
                                      found=1 }
                          END {if (found) print ""}' {} +
Gilles 'SO - hör auf böse zu sein'
quelle
1
grep -rins <pattern> *

Tut das, wonach Sie suchen?

Wenn Sie ein komplexeres Muster haben, z. B. bei der Verwendung egrep, kann es nützlich sein, es egrep -rinos <pattern> *stattdessen zu verwenden .

Fügen Sie --colorder Parameterliste hinzu, um die Lesbarkeit weiter zu verbessern . Persönlich habe ich das in meinem .zshrc:

export GREP_OPTIONS="--color"
Polemon
quelle
1
-i ignoriert Fälle, nach denen nicht gefragt wurde.
Benutzer unbekannt
0

Wenn Sie einen vollständigen Baum suchen möchten, versuchen Sie es

find . -exec grep -n blah  {} /; -ls  

oder tut ähnlich

find . -exec grep -n blah {} /; -print
AndyM
quelle
0

grepDas -HTag von 'enthält den Dateinamen, grepdas Tag -n gibt die Zeilennummer aus. Wenn Sie nur die erste Übereinstimmung und den Dateinamen auflisten möchten, können Sie verwenden -l.
Um zusätzliche Informationen auszuschließen, an die Sie weiterleiten können, erhalten Sie sedsowohl die Zeilennummer als auch den Dateinamen, an den Sie weiterleiten können sed.

Peter Nore
quelle