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 der ls
würde weitergeleitet mygrep;
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.