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...

Author: Chris Seymour, 2013-06-21

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.*$|$'
 47
Author: Rob Windsor,
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ę.

 26
Author: chepner,
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: Wyjście JBoss

Spójrz. Jest to niezwykle przydatne do automatycznego kolorowania słów w różnych kolorach. To imponujący projekt zbudowany na bazie ack .

 11
Author: Ehtesh Choudhury,
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.
 5
Author: Bush,
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+""\?\?"

 2
Author: cray,
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.

 1
Author: mikeymouse,
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 
 0
Author: user22097,
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
 0
Author: treulz,
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"}
 0
Author: Ramin Ismayilli,
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