Vergleich von zwei Suchbefehlen

12

Vor kurzem habe ich diesen findEinzeiler erhalten, aber ich kann nicht erklären, woher der Unterschied der beiden folgenden stammt:

Beispiel 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

Beispiel 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

Wie Sie sehen, gibt es in der ersten Datei die spezifische Datei, von der diese Zeichenfolge abgeleitet ist, und bis jetzt bin ich wirklich nicht in der Lage herauszufinden, warum dies geschieht.

VVelev
quelle

Antworten:

17

Sie weisen grep an, 2 Standorte zu durchsuchen. grep zeigt nur den vollständigen Standort an, wenn mehrere Standorte durchsucht werden.

Beispielsweise

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

Beachten Sie, dass grep den Dateinamen weglässt, wenn ich nur eine Datei suche

grep -i "foo" /tmp/herp
foo

Wenn ich jedoch mehrere Suchorte spezifiziere, gibt grep an, wo die einzelnen Übereinstimmungen gefunden wurden

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

Durch Hinzufügen von /dev/nullwird grep dazu gebracht, den vollständigen Pfad auszudrucken, indem 2 Argumente angegeben werden.

Spuder
quelle
1
+1, aber Sie haben vergessen, das "Offensichtliche" zu erwähnen: "Der Grund, warum die hinzugefügte Datei hinzugefügt wurde, ist /dev/null, dass sichergestellt ist, dass alles, was grep-ed ist, nicht in der (leeren) /dev/nullDatei gefunden wird, sodass nur die richtigen Speicherorte ausgegeben werden."
Olivier Dulac
Aber auch wenn /dev/nullSie suchen , verschwenden Sie keine Zeit damit, eine nicht leere Dummy-Datei zu durchsuchen. Und schließlich ist die Absicht der Suche /dev/nullfür diejenigen offensichtlich, die mit dieser Redewendung vertraut sind.
Alexis
5

man grep:

-H, --mit-Dateiname

Drucken Sie den Dateinamen für jede Übereinstimmung. Dies ist die Standardeinstellung, wenn mehr als eine Datei durchsucht werden muss.

Der Unterschied ergibt sich aus dem Aufruf von grep mit ein oder zwei Dateiargumenten in beiden Fällen. Anstatt hinzuzufügen /dev/null, könnten Sie grepmit dem Argument aufrufen -H. Vielleicht wird das /dev/nullVerhalten weiter unterstützt.

Hauke ​​Laging
quelle
3
grep -Hist nicht portabel - der /dev/nullTrick funktioniert ohne GNU grep.
Chris Down
4

Das erste Beispiel entspricht dem Ausführen von grep über zwei Dateien für jede Datei, die als Ergebnis des findAusdrucks gefunden wurde. Zum Beispiel, wenn finddrei Dateien gefunden a.txtwerden b.txtund c.txtdann ausgeführt grepwird als

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

Zu welcher grepwird der Dateiname angezeigt, für den die Ausgabe passt. Da nichts mit / dev / null übereinstimmt, wird garantiert, dass der Dateiname der ersten Datei gedruckt wird, wenn er übereinstimmt.

Das zweite Beispiel ist äquivalent zu

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

In diesem Fall wird der Dateiname nicht für Übereinstimmungen gedruckt, da es nur ein Argument gibt.

mkc
quelle