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 -H
Option für grep zu verwenden, die laut man
sagt, print the filename for each match
aber in meiner Shell steht nur
(standard input):$DATABASE_FUNCTION = dothis();
Antworten:
Verwenden Sie dafür keine Katze. Verwenden Sie stattdessen
grep DATABASE *
odergrep -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
-H
ist 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.quelle
Verwendung
grep -H DATABASE *
(Hinweis: Wenn sich mehr als eine Datei im Verzeichnis befindet,-H
ist 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 sendengrep 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.quelle