Von der man grep
Seite (auf Debian):
BESCHREIBUNG
grep searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing a match to the given PATTERN. By default, grep prints the
matching lines.
Im ersten Fall wird grep
die Datei geöffnet. in der zweiten, öffnet sich die Schale die Datei und weist sie der Standardeingabe grep
und grep
keine Dateinamenargument übergeben wird davon ausgegangen , es seine Standardeingabe grep muss.
Vorteile von 1:
grep
kann mehr als eine Datei erfassen¹.
grep
kann den Dateinamen anzeigen, in dem jedes Vorkommen von line
gefunden wird.
Vorteile von 2:
- Wenn die Datei nicht geöffnet werden kann, gibt die Shell einen Fehler zurück, der relevantere Informationen (wie die Zeilennummer im Skript) und konsistenter enthält (wenn Sie die Shell Dateien auch für andere Befehle öffnen lassen) als wenn
grep
öffnet es. Und wenn die Datei nicht geöffnet werden kann, grep
wird sie nicht einmal aufgerufen (was bei manchen Befehlen - vielleicht auch nicht grep
- einen großen Unterschied machen kann).
- in
grep line < in > out
, wenn in
nicht geöffnet werden kann, out
wird nicht erstellt oder abgeschnitten.
- Es gibt kein Problem mit einigen Dateien mit ungewöhnlichen Namen (wie
-
oder Dateinamen beginnend mit -
) ².
- Kosmetik: Sie können
<file
die Befehlszeile an einer beliebigen Stelle platzieren, um den Befehlsfluss natürlicher darzustellen, wie <in grep line >out
Sie es vorziehen.
Kosmetik: Mit GNU grep
können Sie auswählen, welches Label vor der passenden Zeile verwendet werden soll, anstatt nur den Dateinamen wie in:
<file grep --label='Found in file at line' -Hn line
In Bezug auf die Leistung, wenn die Datei nicht geöffnet werden kann, speichern Sie die Ausführung grep
bei Verwendung der Umleitung, aber ansonsten grep
erwarte ich keinen großen Unterschied.
Mit der Umleitung sparen Sie sich die Übergabe eines zusätzlichen Arguments, grep
und das grep
Parsen der Argumente wird etwas einfacher. Andererseits benötigt die Shell (mindestens) einen zusätzlichen Systemaufruf zum dup2()
Dateideskriptor auf Dateideskriptor 0.
In { grep -m1 line; next command; } < file
, grep
(hier GNU grep
) werden will , seek()
um direkt nach der Übereinstimmungslinie zurück , so dass die next command
den Rest der Datei sieht (es wird auch brauchen , um zu bestimmen , ob die Datei durchsuchbar ist oder nicht). Mit anderen Worten, die Position innerhalb von stdin ist eine weitere grep
Ausgabe von stdin . Mit grep -m1 line file
, es kann das optimieren, das ist eine Sache weniger, um die grep
man sich kümmern muss.
Anmerkungen
¹ Mit zsh
können Sie Folgendes tun:
grep line < file1 < file2
Dies entspricht jedoch cat file1 file2 | grep line
(ohne das cat
Dienstprogramm aufzurufen ) und ist daher weniger effizient. Dies kann zu Verwirrung führen, wenn die erste Datei nicht mit einem Zeilenumbruch endet und Sie nicht wissen lassen, in welcher Datei das Muster gefunden wird.
² Im Fall von ksh93
und bash
obwohl gibt es Dateien wie /dev/tcp/host/port
(und /dev/fd/x
auf einigen Systemen in bash
), bei denen die Shell bei Verwendung als Umleitungsziel für spezielle Zwecke abfängt, anstatt die Datei wirklich auf dem Dateisystem zu öffnen (obwohl im Allgemeinen diese Dateien) existiert nicht im Dateisystem). /dev/stdin
Dies hat den gleichen Zweck wie der -
, der von erkannt wurde grep
, aber zumindest ist der Namespace hier korrekter (jeder kann eine Datei erstellen, die -
in einem beliebigen Verzeichnis aufgerufen wird , während nur Administratoren eine Datei erstellen können, die aufgerufen wird, /dev/tcp/host/port
und Administratoren sollten es besser wissen).
Die Antwort von StephaneChazelas deckt ab
grep(1)
, und die meisten Befehle der Unix-Linie funktionieren auf diese Weise, aber nicht alle. Es ist Standard, entweder von der Standardeingabe (von der Tastatur, von einer über umgeleiteten Datei< file
oder von der durch einen anderen Befehl weitergeleiteten Ausgabe, dummes Beispiells * | grep '^ab*c$'
) oder von der (den) Datei (en) zu lesen, die als Argumente wie angegeben sindgrep comment file1 file2 file3
. Bei einigen Befehlen wird die Konvention verwendet, dass die genannte Datei die-
Standardeingabe ist. Sie können also sagenmake-middle | cat head - tail
, dass Sie einen Streamhead
abrufengen-middle
möchten, unabhängig davon, was generiert wird, gefolgt vontail
. Dies ist beabsichtigt, um die Verwendung der Befehle flexibel zu gestalten.Welches ist besser? Solange es funktioniert,
cmd file
ist kürzer alscmd < file
; Möglicherweise gibt es einen kleinen Zeitunterschied zwischen der Shell, die das Datei-Frobbing (<
) ausführt, und dem Befehl, der es selbst ausführt , aber wahrscheinlich unbemerkt, es sei denn, Sie tun den ganzen Tag nichts anderes. Es wird auf Überlegungen wie die in Stephanes Antwort erwähnten Profis ankommen.quelle
cmd file
ist nicht kürzer alscmd<file
wenn.<
.