Betrachten Sie die folgende Eingabedatei:
1
2
3
4
Laufen
{ grep -q 2; cat; } < infile
druckt nichts. Ich würde erwarten, dass es gedruckt wird
3
4
Ich kann die erwartete Ausgabe erhalten, wenn ich sie in ändere
{ sed -n 2q; cat; } < infile
Warum gibt der erste Befehl die erwartete Ausgabe nicht aus?
Es ist eine suchbare Eingabedatei und entspricht dem Standard unter OPTIONEN :
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
und weiter unten unter ANWENDUNGSVERWENDUNG (meine hervorheben):
Mit dieser
-qOption können Sie auf einfache Weise feststellen, ob ein Muster (oder eine Zeichenfolge) in einer Gruppe von Dateien vorhanden ist. Beim Durchsuchen mehrerer Dateien wird eine Leistungsverbesserung erzielt ( da die Suche beendet werden kann, sobald die erste Übereinstimmung gefunden wird ). [...]
Jetzt nach dem gleichen Standard (in der Einleitung unter INPUT FILES )
Wenn ein Standarddienstprogramm eine suchbare Eingabedatei liest und ohne Fehler beendet, bevor das Dateiende erreicht ist, muss das Dienstprogramm sicherstellen, dass der Dateiversatz in der Beschreibung der geöffneten Datei genau hinter dem letzten vom Dienstprogramm verarbeiteten Byte [ positioniert ist . ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
Der zweite Befehl entspricht nur dann dem ersten, wenn die Datei gesucht werden kann.
Warum grep -qverbraucht die ganze Datei?
Dies ist, gnu grepwenn es darauf ankommt (obwohl Kusalananda gerade bestätigt hat, dass dasselbe unter OpenBSD passiert)
grepist eine Abzweigung von etwas, das sich FreeGrep nennt , wenn sich jemand wundert.