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 niego ls
zostanie przekazana mygrep;
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.