Ich möchte farbige Ausgabe von grep
.
.... Aber
- Strategie 1: GREP_OPTIONS. Dies ist jedoch veraltet. Siehe http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
- Stragegy 2: GREP_COLORS sehen auf den ersten Blick wie eine Lösung aus, aber das macht etwas anderes.
- Strategie 3: Alias. Dies funktioniert nicht
find ... | xargs grep
, da xargs keine Aliase auswertet. - Strategie 4: Schreiben Sie ein einfaches Wrapper-Skript. Nein, ich denke, das ist zu schmutzig und macht mehr Ärger als es löst.
- Strategie 5: Patchen Sie den Quellcode
- Strategie 6: Wenden Sie sich an grep-Entwickler und fordern Sie einen Ersatz für GREP_OPTIONS an
- Strategie NICE-and-EASY: ... das fehlt. Ich habe keine Ahnung.
Wie kann man das lösen?
Vielen Dank für Ihren Versuch zu helfen!
... aber ich kann das Kopfgeld nicht geben
Nennen Sie mich unhöflich, arogant, beleidigend, missbräuchlich ...
Ich sehe nur Workarounds - keine Lösung. Keine Antwort befriedigte die Frage.
Vielen Dank für deine Mühe.
color_option
2
--color
Option hat bereits den Wertauto
. Ich weiß nur nicht, warum Sie es nicht standardmäßig aktivieren können.exec grep --color=auto "$@"
) bevorzugen , optional mit einem anderen Namen (grepc
odercolorgrep
). Dies hat einen vernachlässigbaren Overhead (und keine zusätzlichen gleichzeitigen Prozesse zur Laufzeit). Der Grund, warum Sie sie als "nicht einfach genug" bezeichnet haben, ist die Tatsache, dass Sie diese Funktion nicht als nützlich genug erachten, um den (relativ geringen) einmaligen Aufwand für ihre Implementierung aufzuwenden, und nach jemand anderem suchen, der sie für Sie erledigt. Aus diesem Grund sind Ihre "nicht wirklich eine Antwort" -Kommentare zu den geposteten Antworten ziemlich unhöflich.Antworten:
Einige der Gründe, aus denen OP angegeben hat, dass die Optionen ungeeignet sind, haben in der Realität keine Grundlage. Hier zeige ich, welche Auswirkungen die Strategie 4 von OP hat:
Wird bei den meisten Distributionen
grep
in/bin
(typisch) oder/usr/bin
(OpenSUSE, möglicherweise in anderen) installiert undPATH
enthält standardmäßig/usr/local/bin
vor/bin
oder/usr/bin
. Dies bedeutet , dass , wenn Sie erstellen/usr/local/bin/grep
mitWo
/bin/sh
ist eine POSIX-kompatible Shell, die von Ihrer Distribution bereitgestellt wird, normalerweise Bash oder Dash. Wenn dringrep
ist/usr/bin
, dann mach dasDer Overhead dieses Skripts ist minimal. Die
exec
Anweisung bedeutet, dass der Skriptinterpreter durch diegrep
Binärdatei ersetzt wird. Dies bedeutet, dass die Shell währendgrep
der Ausführung nicht im Speicher verbleibt . Somit ist der einzige Overhead eine zusätzliche Ausführung des Skriptinterpreters, dh eine kleine Latenz in der Wanduhrzeit. Die Latenz ist ungefähr konstant (hängt nur davon ab, obgrep
undsh
sich bereits im Seitencache befinden oder nicht und wie viel E / A-Bandbreite verfügbar ist) und hängt nicht davon ab, wie lange siegrep
ausgeführt wird oder wie viele Daten verarbeitet werden.Wie lange dauert diese Latenz, dh der vom Wrapper-Skript hinzugefügte Overhead?
Um dies herauszufinden, erstellen Sie das obige Skript und führen Sie es aus
Auf meinem Computer benötigt Ersteres 0,005 Sekunden in Echtzeit (über eine große Anzahl von Läufen), während Letzteres 0,006 Sekunden in Echtzeit benötigt. Daher beträgt der Aufwand für die Verwendung des Wrappers auf meinem Computer 0,001 s (oder weniger) pro Aufruf.
Das ist unbedeutend.
Ich sehe auch nichts "Schmutziges" daran, weil viele gängige Anwendungen und Dienstprogramme denselben Ansatz verwenden. Um die Liste solcher auf Ihrem Computer in
/bin
und/usr/bin
anzuzeigen, führen Sie sie einfach ausAuf meinem Rechner enthält die obige Ausgabe
egrep
,fgrep
,zgrep
,which
,7z
,chromium-browser
,ldd
, undxfig
, das ich ziemlich oft. Wenn Sie Ihre gesamte Distribution nicht als "schmutzig" betrachten, weil Sie sich auf Wrapper-Skripte verlassen, haben Sie keinen Grund, solche Wrapper-Skripte als "schmutzig" zu betrachten.Bei Problemen kann ein solches Wrapper-Skript Folgendes verursachen:
Wenn nur menschliche Benutzer (im Gegensatz zu Skripten gegen) werden mit der Version von grep , dass standardmäßig Farbunterstützung , wenn Ausgabe an einen Terminal ist, dann kann der Wrapper - Skript benannt werden
colorgrep
odercgrep
oder was auch immer der OP sieht fit.Dies vermeidet alle möglichen Kompatibilitätsprobleme, da sich das Verhalten von
grep
überhaupt nicht ändert.Aktivieren von
grep
Optionen mit einem Wrapper-Skript, jedoch auf eine Weise, die neue Probleme vermeidet:Wir können das Wrapper-Skript einfach umschreiben, um eine benutzerdefinierte Datei zu unterstützen,
GREP_OPTS
auch wennGREP_OPTIONS
sie nicht unterstützt wird (da sie bereits veraltet ist). Auf diese Weise können Benutzer einfachexport "GREP_OPTIONS=--color=auto"
oder ähnlich zu ihrem Profil hinzufügen ./usr/local/bin/grep
ist dannBeachten Sie, dass keine Anführungszeichen vorhanden sind
$GREP_OPTIONS
, sodass Benutzer mehr als eine Option angeben können.Auf meinem System ist die Ausführung
time /usr/local/bin/grep --version
mitGREP_OPTIONS
leer oder mitGREP_OPTIONS=--color=auto
genauso schnell wie in der vorherigen Version des Wrapper-Skripts. Das heißt, die Ausführung dauert normalerweise eine Millisekunde länger als normalgrep
.Diese letzte Version würde ich persönlich zur Verwendung empfehlen.
Zusammenfassend die Strategie 4 von OP:
wird bereits von
grep
Entwicklern empfohlenist trivial zu implementieren (zwei Zeilen)
hat einen unbedeutenden Overhead (eine Millisekunde zusätzliche Latenz pro Aufruf auf diesem bestimmten Laptop; auf jedem Computer leicht zu überprüfen)
kann als Wrapper-Skript implementiert werden, das
GREP_OPTS
Unterstützung hinzufügt (um veraltete / nicht unterstützte zu ersetzenGREP_OPTIONS
)kann implementiert werden (als
colorgrep
/cgrep
), ohne dass Skripte oder vorhandene Benutzer betroffen sindDa es sich um eine Technik handelt, die bereits in Linux-Distributionen weit verbreitet ist, handelt es sich um eine gängige Technik, die nicht "schmutzig" ist.
Wenn es als separater Wrapper (
colorgrep
/cgrep
) implementiert wird , kann es keine neuen Probleme verursachen, da es dasgrep
Verhalten überhaupt nicht beeinflusst . Wenn es als Wrapper-Skript implementiert wird, dasGREP_OPTS
Unterstützung hinzufügt ,GREP_OPTS=--color=auto
birgt die Verwendung genau die gleichen Risiken (z. B. Probleme mit vorhandenen Skripten) wie das vorgelagerte Hinzufügen von Standard--color=auto
. Daher ist der Kommentar, dass dies "mehr Probleme schafft als löst", völlig falsch: Es werden keine zusätzlichen Probleme erstellt.quelle
Die Dokumentation, die Sie mit der ersten Strategie bereitstellen, lautet:
Wenn der Alias für Sie nicht möglich ist, ist das Wrapper-Skript der einzige Weg.
quelle
Der Grund, warum die
GREP_OPTIONS
Variable veraltet ist, besteht darin, dass sie Probleme verursacht, wenngrep
sie irgendwo in einem Skript aufgerufen wird und das Skript nicht mit den alternativen Optionen funktioniert, die von der Variablen stammen. Wenn Sie ein Wrapper-Skript für schreibengrep
, haben Sie das gleiche Problem, es sei denn, Sie geben ihm einen anderen Namen .Alternativ können Sie Ihre bevorzugten Optionen in einer Variablen speichern. In anderen Shells als zsh ist dies umständlich, wenn die Optionen Platzhalterzeichen (
\[*?
) enthalten. Andernfalls können Sie einfach die Variable ohne Anführungszeichen verwenden, um einen Befehl mit Argumenten abzurufen.Beachten Sie, dass GNU und BSD grep einen Verzeichnisbaum rekursiv verarbeiten können, wodurch die Notwendigkeit einer
find
Kombination in dengrep
meisten Fällen verringert wird .quelle
grep
, benötigen Sie einen Befehl mit einem anderen Namen. Wenn Sie denselben Namen beibehalten, werden Skripte unterbrochen, die das ursprüngliche / Standardverhalten erwarten. Das ist das sauberste und verursacht keine zusätzlichen Probleme .Am einfachsten ist es, einen Alias zu verwenden (Strategie 3). Wenn Sie sich wirklich für den
xargs
Befehl interessieren , können Sie ihn dennoch mit einer Bash-Funktion überschreiben.Dies ist jedoch nicht besser als die Verwendung eines Wrapper-Befehls, der vom
grep
Team als empfohlene Lösung angesehen wird :Meiner bescheidenen Meinung nach sollten Sie sich an das
grep
Entwicklerteam wenden , um sie zu bitten, einen einfachen Ersatz für dieGREP_OPTIONS
Variable bereitzustellen, der die Farbegrep
gemäß einer Umgebungsvariablen ermöglicht.Es wäre für sie recht einfach, die
color
Option standardmäßig zu aktivieren oder wenn dieGREP_COLORS
festgelegt wurde.quelle
Dies ist die Lösung aus der Top-Antwort von @NominalAnimal, jedoch mit den üblichen
grep: ...
Warnungen (anstelle von/bin/grep: ...
):quelle