Wyjście Grep z wieloma kolorami?
Czy w bash istnieje elegancka metoda uruchamiania grepa na pliku tekstowym z 2 lub więcej wzorcami, a każdy pasujący wzorzec jest wyświetlany w innym kolorze?
Więc linia, która pasuje do MALE
i AUGUST
, by umieścić MALE
w Kolorze Niebieskim i AUGUST
w kolorze pomarańczowym?
Jestem otwarty na korzystanie z sed
, awk
, grep
i kredki lub inne...
9 answers
Można kaskadować grepy z różnymi kolorami, podając --color = always I używając wyrażenia regularnego ' foo/$', aby przekazać wszystkie linie.
Na przykład:
tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$'
Jeśli chcesz, aby cały wiersz był podświetlony, zaktualizuj odpowiednio swoje Wyrażenie regularne:
.... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-28 19:50:30
grep
jest matcherem wyrażeń regularnych, a nie zakreślaczem składni :). Będziesz musiał użyć wielu wywołań grep
, używając innej wartości GREP_COLOR
dla każdego.
GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar
To podkreślałoby " foo " i "bar"w różnych kolorach w liniach, które pasują do obu. Nie wydaje mi się, że istnieje (prosty) sposób na obsługę wszystkich wystąpień dowolnego wzorca, bez połączenia strumienia wyjściowego dwóch niezależnych wywołań:
{ GREP_COLOR="1;32" grep foo file.txt
GREP_COLOR="1;36" grep bar file.txt
} | ...
Które oczywiście będą wyglądać inaczej niż gdyby tam były sposobem na przypisanie osobnego koloru do każdego wyrażenia regularnego.
Możesz użyć awk
, aby zastąpić każdy mecz sobą zawiniętym w prawidłowy kod kontrolny.
echo "foo bar" | awk '{ gsub("bar", "\033[1;33m&\033[0m");
gsub("foo", "\033[1;36m&\033[0m"); print }'
W każdej linii, globalnie zastępujesz wszystko, co pasuje do podanego wyrażenia regularnego samym sobą (&
) owinięte w sekwencje escape ANSI dla żądanego koloru (co grep --color
robi dla Ciebie). Po przetworzeniu wszystkich możliwych dopasowań musisz wyraźnie wydrukować linię.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-20 12:02:53
Jeśli chcesz coś wyjąć z pudełka, prawdopodobnie szukasz hhighlighter .
Oto przykład:
Spójrz. Jest to niezwykle przydatne do automatycznego kolorowania słów w różnych kolorach. To imponujący projekt zbudowany na bazie ack .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-15 06:09:09
Miałem potrzebę podkreślania ciągów w plikach tekstowych i nie znalazłem sposobu, który odpowiadałby moim potrzebom, więc napisałem prosty program w języku C do kolorowania ciągów pasujących do wyrażeń regularnych.
Możesz pobrać kod źródłowy z GitHub :
git clone http://github.com/mbornet-hl/hl
Wtedy:
cd hl/cr; make
Oto sposób użycia:
hl: version 1.21
Usage: hl [-h|-eidD][-E][-rgybmcwRGYBMCW] regexp ...
-h : help
-v : version
-u : do not bufferize output on stdout
-e : extended regular expressions
-i : ignore case
-E : print on stderr
-r : red
-g : green
-y : yellow
-b : blue
-m : magenta
-c : cyan
-w : white
-R : red (reverse video)
-G : green (reverse video)
-Y : yellow (reverse video)
-B : blue (reverse video)
-M : magenta (reverse video)
-C : cyan (reverse video)
-W : white (reverse video)
-d : debug
-D : display regular expressions
Aby pokolorować słowo "czerwony" na czerwono, a słowo "niebieski" na niebiesko, wystarczy wpisać następujące polecenie:
echo "red blue red blue" | hl -r red -b blue
A oto przykład na podkreślenie wyjście polecenia ifconfig:
hl -ei -m '^(eth|(vir)?br|vnet)[0-9.]*:[0-9]+\>' \
-b '^(eth|(vir)?br|vnet)[0-9.]*\.[0-9]+\>' \
-c '([0-9a-f]{2}:){5}[0-9a-f]{2}' \
-g '\<UP\>|\<RUNNING\>|([0-9]{1,3}\.){3}[0-9]{1,3}\>' \
-y '^(eth|(vir)?br|vnet)[0-9.:]*\>' \
-W '[0-9a-f]{4}::[0-9a-f]{4}\:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}' \
-r ' (errors|dropped|overruns):[^0][0-9]*'
Kolejność, w jakiej określasz kolory jest ważna: jeśli łańcuch znaków pasuje do kilku wyrażeń regularnych, pierwsze jako priorytet wyższy niż drugie, drugie jako priorytet wyższy niż trzecie, i tak dalej ...
Mam Nadzieję, Że To Pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-22 13:13:59
Wypróbuj wspaniały rpen http://github.com/rtulke/rpen
Wymagaj egrep lub grep
Cp rpen.py / usr / local / bin / rpen chmod 777/usr/local/bin / rpen
Następnie spróbuj
Ps xau / rpen Ss " S+""\?\?"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 21:41:16
Oto wersja(wersje) używająca sed. Powiedzmy, że chcesz, aby słowo "FAILED" było zabarwione na czerwono, to będzie:
sed 's/\(ERROR\)/\o033[31m\1\o033[39m/'
Aby cała linia zawierająca słowo "FAILED" była zaznaczona na Czerwono:
sed 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/'
Aby mieć wiele słów oznaczonych na Czerwono:
sed 's/\(ERROR\|FAILED\)/\o033[31m\1\o033[39m/'
Aby mieć wiele słów i ich wiersze wohle oznaczone na Czerwono:
sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\1\o033[39m/'
Aby mieć wiele kolorów (ERROR=red/FAILED=blue)
sed -e 's/\(ERROR\)/\o033[31m\1\o033[39m/' -e 's/\(FAILED\)/\o033[34m\1\o033[39m/'
Aby użyć tego wszystkiego przez ssh:
ssh user@host -t "tail -n 1024 -f /some/log/file | sed --unbuffered -e 's/\(.*ERROR.*\|.*FAILED.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*postfix.*\|.*dhcpd.*\)/\o033[32m\1\o033[39m/'"
I za brak konieczności wpisywania tego za każdym razem po prostu zadeklaruj ją jako funkcję w swoim bashrc.
Dla innych kolorów poszukaj kodów ANSI.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-22 17:24:26
Co ty na to? Możesz to zrobić tylko z grep ' em! Oto sztuczki: (1) bierzesz /lub/ słów, których szukasz; (2) używasz opcji-a i-B z wystarczająco dużymi liczbami (większymi niż liczba linii Twojego pliku).
echo "you make it" > tmp
echo "you take it" >> tmp
echo "you cake it" >> tmp
echo "you bake it" >> tmp
echo "you wake it" >> tmp
GREP_COLOR='1;32' grep -P "(take|cake|bake)" --color=always tmp | GREP_COLOR='1;33' grep -P "(cake|bake)" --color=always -A10000 -B10000 | GREP_COLOR='1;34' grep -P "(bake)" --color=always -A10000 -B10000
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-19 01:55:53
Cxpgrep jest odpowiedni do tego celu - podświetl wzory w różnych kolorach.
cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-06 21:24:41
Moja odpowiedź jest poniżej:
tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"} '/MALE/' {print "\033[33m" $0 "\033[39m"}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-31 12:56:33