Ich versuche, jeden grep-Befehl zu veranlassen, die Ergebnisse in einer anderen Farbe hervorzuheben. Ich kann es manuell mit einer Zeile wie dieser machen:
ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f
Jedes c
Zeichen wird grün hervorgehoben und jedes o
Zeichen wird rot hervorgehoben, etc ...
Damit dieses Beispiel funktioniert, müssen Sie sicherstellen, dass
--color=always
Ihre grep-Befehle immer verfügbar sind. Ich habe dies.bashrc
so eingestellt, dass grep immer Farben hat:
export GREP_OPTIONS='--color=always'
Ich versuche, diese Funktionalität mit einem Alias zu versehen, damit ich jedes Mal grep
einen anderen GREP_COLORS
Wert aufrufen kann . Ich verstehe die Berücksichtigung mehrerer Shells für jedes neue Pipe-Grep und versuche, dies zu überwinden, indem ich einige Dateien (eine für jede Farbe) erstelle, um anzuzeigen, dass sie bereits verwendet wurden.
Ich habe einige Versuche unternommen, aber seltsamerweise scheint dieser "am besten" zu funktionieren. Ich habe das in meinem .bashrc
:
alias mg="mygrep"
mygrep(){
# define possible colors
COLORS=("01;32" "01;31" "01;34" "01;36")
COUNTER=0
NUM=0
# as long as the color has already been used, keep searching
while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
# get a random index
let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
wait ${!}
$(( COUNTER+=1 ))
if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
# remove all color locks
rm /home/lior/Desktop/mygrep_*
wait ${!}
fi
done
# mark this color as used
touch /home/lior/Desktop/mygrep_$NUM
wait ${!}
# lets go!
GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}
Ich benutze diesen Alias wie folgt:
ll | mg c | mg o | mg n | mg f
Die Ergebnisse sind ziemlich cool. Es gibt jedoch einige Fehler, die sich jedes Mal geringfügig unterscheiden. Hier sind ein paar Screenshots:
Sieht so aus, als ob die Shell jeden Pipe-Befehl durchläuft und die vorherige Funktion ihre Ausführung noch nicht beendet hat. Es wird versucht, nicht mehr vorhandene Dateien zu entfernen. Ich bin mir nicht sicher, woher diese anderen command not found
Fehler kommen.
Wie Sie sehen, habe ich einige wait
Befehle eingegeben, um die Dateimanipulation zu beenden, aber dies scheint nicht allzu gut zu funktionieren. Eine andere Sache, die ich bereits ausprobiert habe, ist die Verwendung von Shared Memory, die /dev/shm
jedoch zu ähnlichen Ergebnissen führt.
Wie würde ich vorgehen, um die gewünschten Ergebnisse zu erzielen?
Hinweis:
Ich bin auf der Suche nach Antworten, die einfach den Befehl grep umbrechen, da er viele Funktionen enthält, die ich verwenden möchte, und beabsichtige, andere Logik zwischen die Pipes einzufügen, sodass ich nicht alle Suchbegriffe auf einmal bereitstellen möchte. Ich bin auch nicht auf der Suche nach anderen "grep like" Tools. Sorry an @terdon , der bereits einen tollen Perl-Vorschlag gepostet hat.
alias mg="mygrep; grep"
?mygrep;
sich ein neuer Befehl in sich verwandelt und der Datenstrom verloren geht. Die eingehende Pipe von derls
würde weitergeleitetmygrep;
und nicht zu grep. Zumindest verstehe ich das so.--color=always
alle Ihre grep-Befehle aktiviert haben. Ich habe das global in meinem festgelegt.bashrc
. Ich habe das in der Post bearbeitet.Antworten:
Hier ist ein anderer Ansatz. Ich habe ein kleines Perl-Skript, das ich bereits in einer anderen Antwort veröffentlicht habe, die die vom Benutzer bereitgestellten Muster in verschiedenen Farben hervorhebt. Eine leicht modifizierte Version des Skripts sieht folgendermaßen aus
grep
:Wenn Sie dieses Skript
cgrep
irgendwo in Ihrem speichernPATH
und ausführbar machen, können Sie bis zu 10 verschiedene Muster angeben, von denen jedes in einer anderen Farbe gedruckt wird:quelle
Jeder Aufruf von
grep
in einer Pipe wird in einer separaten Shell ausgeführt, sodass Sie einen Status zwischen ihnen übergeben müssen. Die folgende Lösung ist eine einfache Möglichkeit, dies mit einer Datei zu tun, die den Farbindex enthält, und einer Sperrdatei, die sicherstellt, dass gleichzeitige Aufrufe nicht denselben Wert lesen:Testen Sie unter der Annahme, dass Sie Ihre Kopie benannt haben,
cgrep
und platzieren Sie sie auf IhrerPATH
:quelle
COLOR_INDEX
undGREP_COLORS
. Ich habe versucht, diese am Ende der Funktion ohne Erfolg zu exportieren. Ist es das, was du meintest? Einfach zu habenexport VAR
, oder?COLOR_TOGGLE
. Vielen Dank für den Fang :)grep "$@"
Vorschlag aufgenommen - der den Alias aussortiert, um die Funktion auszuführen, und dann grep.Wenn Sie gut mit regulären Ausdrücken umgehen können, sollten Sie grc und grcat ausprobieren. grc ruft grcat auf.
grcat verwendet Konfigurationsdateien, in denen Sie reguläre Ausdrücke hinzufügen können, um dem Text zu entsprechen, der in jeder Farbe angezeigt werden soll. Es gibt auch eine Reihe anderer Optionen. Standardmäßig werden Systemprotokolldateien eingefärbt.
Je nachdem, was Sie für Ihr endgültiges Skript im Sinn haben, können Sie Ihre Ausgabe möglicherweise mit nur einem Befehl einfärben.
Der Trick besteht darin, die regulären Ausdrücke für jedes "Feld" in Ihrer Datenquelle korrekt anzugeben. Dies ist viel einfacher, wenn Ihre Daten eine relativ einheitliche Struktur haben.
Das letzte Mal, als ich es ausprobiert habe, bin ich nicht weit gekommen, aber ich kann es vielleicht noch einmal versuchen, weil ich ein bisschen besser in Regex bin als damals.
Es gibt auch den Befehl tput, mit dem Sie Informationen (z. B. Farbänderungen) direkt an Ihr Endgerät senden können.
Beide Ansätze werden im folgenden Beitrag behandelt. Es handelt sich um den Befehl find, kann jedoch auf die Ausgabe eines beliebigen Befehls angewendet werden.
Farbige FIND-Ausgabe?
quelle