Próbuję uzyskać każde polecenie grep, aby podświetlić jego wyniki w innym kolorze. Mogę to zrobić ręcznie za pomocą takiej linii:
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
Każda c
postać zostanie podświetlona na zielono, a każda o
postać zostanie wyróżniona na czerwono itp.
Aby ten przykład zadziałał, musisz upewnić się, że zawsze
--color=always
używasz poleceń grep. Ustawiłem to w moim,.bashrc
więc grep zawsze będzie miał kolory:
export GREP_OPTIONS='--color=always'
To, co próbuję osiągnąć, to owinięcie tej funkcji aliasem, dzięki czemu mogę po prostu zadzwonić grep
i za GREP_COLORS
każdym razem mieć inną wartość. Rozumiem rozważanie wielu powłok dla każdego nowego grep potokowego i staram się to obejść, tworząc niektóre pliki (po jednym dla każdego koloru), aby wskazać, że były już używane.
Podjąłem kilka prób, ale o dziwo, ta wydaje się działać „najlepiej”. Mam to w moim .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 "$@"
}
Używam tego aliasu tak:
ll | mg c | mg o | mg n | mg f
Wyniki są całkiem fajne. Istnieją jednak pewne błędy, które są nieco inne za każdym razem. Oto kilka zrzutów ekranu:
Wygląda na to, że gdy powłoka przechodzi przez każde polecenie potoku, poprzednia funkcja jeszcze nie zakończyła wykonywania. Próbuje usunąć pliki, które już nie istnieją. Nie jestem zbyt pewien, skąd pochodzą te inne command not found
błędy.
Jak widać, wprowadziłem kilka wait
poleceń, aby spróbować zakończyć manipulację plikami, ale nie wydaje się to działać zbyt dobrze. Inną rzeczą, którą już wypróbowałem, jest użycie pamięci współdzielonej, /dev/shm
ale przyniosło to podobne wyniki.
Jak mogę uzyskać pożądane wyniki?
Uwaga:
Szukam odpowiedzi, które po prostu zawiną polecenie grep, ponieważ ma wiele funkcji, których chcę użyć i zamierzam wstawić inną logikę między potokami, więc nie chcę podawać wszystkich wyszukiwanych haseł jednocześnie. Nie szukam też innych narzędzi typu „grep like”. Przepraszam @terdon, który już opublikował niesamowitą propozycję perla.
alias mg="mygrep; grep"
?mygrep;
zmienia się w nowe polecenie samo w sobie i strumień danych ginie. Przychodząca rura z niegols
zostanie przekazanamygrep;
i nie będzie grep. Przynajmniej tak to rozumiem.--color=always
wszystkie polecenia grep. Ustawiłem to globalnie w swoim.bashrc
. Zredagowałem to w poście.Odpowiedzi:
Oto inne podejście. Mam mały skrypt Perla, który już opublikowałem w innej odpowiedzi, która podświetli wzory dostarczone przez użytkownika w różnych kolorach. Nieznacznie zmodyfikowana wersja skryptu będzie działać następująco
grep
:Jeśli zapiszesz ten skrypt
cgrep
gdzieś w swoimPATH
pliku i sprawisz, że będzie on wykonywalny, możesz określić do 10 różnych wzorów, z których każdy zostanie wydrukowany w innym kolorze:źródło
Każde wywołanie
grep
w potoku działa w osobnej powłoce, więc musisz przekazać między nimi pewien stan. Poniższe rozwiązanie jest prostym sposobem radzenia sobie z tym za pomocą pliku z indeksem kolorów i pliku blokady, który zapewnia, że jednoczesne połączenia nie będą odczytywać tej samej wartości:Przetestuj, zakładając, że nazwałeś swoją kopię
cgrep
i umieściłeś ją naPATH
:źródło
COLOR_INDEX
iGREP_COLORS
. Próbowałem wyeksportować je pod koniec funkcji bez powodzenia. Czy o to ci chodziło? Po prostu miećexport VAR
, prawda?COLOR_TOGGLE
. Dzięki za złapanie :)grep "$@"
sugestię - uporządkowałem alias, aby uruchomić funkcję, a następnie grep.Jeśli jesteś dobry w wyrażeniach regularnych, możesz chcieć sprawdzić grc i grcat. grc nazywa grcat.
grcat używa plików konfiguracyjnych, w których można dodawać wyrażenia regularne w celu dopasowania tekstu wyświetlanego w każdym kolorze. Ma również wiele innych opcji. Domyślnie koloruje systemowe pliki dziennika.
W zależności od tego, co masz na myśli w końcowym skrypcie, możesz pokolorować wydruk za pomocą jednego polecenia.
Sztuką jest prawidłowe określenie wyrażeń regularnych dla każdego „pola” w źródle danych. Będzie to o wiele łatwiejsze, jeśli dane będą miały stosunkowo jednolitą strukturę.
Ostatnim razem, gdy spróbowałem, nie zaszedłem za daleko, ale mogę spróbować jeszcze raz, ponieważ jestem trochę lepszy w wyrażeniach regularnych niż wtedy.
Istnieje również polecenie tput, którego można użyć do przesłania informacji (np. Zmiany kolorów) bezpośrednio do urządzenia końcowego.
Oba podejścia są opisane w poniższym poście. Mówi o poleceniu find, ale może być zastosowane do wyniku dowolnego polecenia.
Kolorowe wyjście FIND?
źródło