Katze * | grep etwas ... in welcher Datei ist das Ergebnis?

8

Wenn man den folgenden Befehl ausführen soll

cat * | grep DATABASE

Die Shell spuckte alle Zeilen in * Dateien aus, die das Wort enthielten DATABASE. Gibt es eine Möglichkeit, auch auszuspucken, von welcher Datei jede Zeile getrennt ist?

Ich habe versucht, die -HOption für grep zu verwenden, die laut mansagt, print the filename for each matchaber in meiner Shell steht nur

(standard input):$DATABASE_FUNCTION = dothis();
Jake Wilson
quelle
gute Frage. Ich versuche immer noch, die Katze zu brechen -> grep Gewohnheit selbst. :)
Sirex

Antworten:

22

Verwenden Sie dafür keine Katze. Verwenden Sie stattdessen grep DATABASE *oder grep -n DATABASE *(wenn Sie die Zeilennummern sowie die Dateinamen kennen möchten) direkt.

Siehe nutzlose Verwendung von Katze .

Um ein bisschen mehr zu verdeutlichen: cat *Verkettet tatsächlich alle Dateien, während sie an grep durch die Pipe weitergeleitet werden, sodass grep nicht wissen kann, welcher Inhalt zu welcher Datei gehört, und tatsächlich nicht einmal wirklich wissen kann, ob es sich um das Scannen von Dateien handelt oder nicht nur mächtig schnell tippen. Es ist alles ein großer Standard-Eingabestream, sobald Sie eine Pipe verwenden.

Schließlich -Hist es fast sicher redundant, da grep den Dateinamen standardmäßig druckt, wenn mehr als eine Datei durchsucht werden muss. Dies kann jedoch hilfreich sein, wenn Sie die Ausgabe analysieren möchten, da der *Glob möglicherweise auf eine einzelne Datei erweitert wird und grep in diesem Fall den Dateinamen weglässt.

Eduardo Ivanec
quelle
6

Verwendung grep -H DATABASE *(Hinweis: Wenn sich mehr als eine Datei im Verzeichnis befindet, -Hist dies optional).

Das Problem, das Sie haben, ist, dass Sie mit Ihrem Befehl cat *alle Dateien zu einem großen Durcheinander verketten und diese dann an |die Standardeingabe von senden grep DATABASE. Bis grep die Daten sieht, sind die Informationen darüber, woher sie stammen, verloren gegangen. Die Lösung besteht darin, dass grep die einzelnen Dateien durchsucht. Wenn es also eine Übereinstimmung findet, weiß es, aus welcher Datei es stammt.

Gordon Davisson
quelle