2013-06-21 6 views
36

Есть ли элегантный метод в bash для запуска grep для текстового файла с двумя или более шаблонами, и каждый шаблон, который соответствует, выводится в другом цвете?Выход Grep с несколькими цветами?

Так линия, которая соответствует по MALE и AUGUST бы из положить MALE в синий и AUGUST в оранжевый? Я открыт для использования sed, awk, grep и цветных карандашей или других ...

+2

'colout' может быть полезным в качестве окрашивающего раствора: http://nojhan.github.io/colout/' задать расширенное 'MALE | АВГУСТ' file.txt | colout MALE синий | colout AUGUST yellow' или если вам не нужно фильтровать текстовый поток, просто выделите его, вы можете сделать это с помощью 'colout MALE blue user2683246

+0

Также проверьте ответы на https://stackoverflow.com/questions/981601/colorized-grep-viewing-the-entire-file-with-highlighted-matches – ndemou

ответ

38

Вы можете каскадом greps разных цветов, указав --color = always и используя регулярное выражение 'foo | $' для передачи всех строк.

Например:

tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$' 

Если вы хотите, чтобы вся строка будет выделена, обновить регулярное выражение, соответственно:

.... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$' 
+0

Это не работает, если те же значения определены в 'GREP_COLORS' (обратите внимание на завершающий' S') - попробуйте отключить его до: '$ GREP_COLORS =' ('GREP_COLOR' устарел) –

+1

Чтобы обновить всю строку, изменив regex - неправильный подход. Вместо этого используйте 'GREP_COLORS = 'sl = 1; 31' grep ...' и укажите sl для окраски всей строки. –

+0

Как ограничить конечные выходные строки только той строкой, где сопоставляется слово? Текущая команда печатает всю строку, но окрашивает слово при обнаружении. Я ищу фактические функции grep в выходе. – mtk

23

grep является регулярным выражение согласовани, а не подсветка синтаксиса :). Вам нужно будет использовать несколько вызовов grep, используя другое значение GREP_COLOR для каждого.

GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar 

Это будет выделять «foo» и «bar» разными цветами в строках, соответствующих обеим. Я не думаю, что есть (простой) способ обработки всех вхождения либо шаблон, короткого слияния выходного потока два независимых вызовов:

{ GREP_COLOR="1;32" grep foo file.txt 
    GREP_COLOR="1;36" grep bar file.txt 
} | ... 

, который, очевидно, будет выглядеть иначе, чем если бы было способ присвоить отдельный цвет каждому регулярному выражению.


Вы можете использовать awk заменить каждый матч с собой завернутые в правильный код управления.

echo "foo bar" | awk '{ gsub("bar", "\033[1;33m&\033[0m"); 
         gsub("foo", "\033[1;36m&\033[0m"); print }' 

В каждой строке, вы глобально заменить что-нибудь, соответствующее заданный регулярное выражение с самими собой (&), завернутым в управляющих последовательностях ANSI для нужного цвета (который grep --color делает для вас). После обработки всех возможных совпадений вам нужно явно напечатать строку.

10

Если вы хотите что-то из коробки, вы, вероятно, ищете hhighlighter.

Вот пример: JBoss output

Взгляни. Это невероятно полезно для раскрашивания слов разных цветов автоматически. Это впечатляющий проект, построенный на вершине ack.

+1

h highlighter - это небольшая функция Bash, которая автоматизирует строительство конвейер команд 'ack' и работает так же, как и два других ответа' grep'. –

2

Попробуйте чудесный rpen http://github.com/rtulke/rpen

Требовать задать расширенную или Grep

cp rpen.ру/USR/местные/бен/rpen CHMOD 777/USR/местные/бен/rpen

попробуйте

пс XAU |? rpen Ss "S +" "\ \"

+0

На cygwin я нашел установку rpen очень простой. Я не мог получить помощь и h, чтобы работать. Пример использования: '$ cat ~ /.bashrc | rpen alias export' – Ellis

0

Как насчет этого? Вы можете сделать это с помощью grep ТОЛЬКО! Трюки здесь: (1) вы берете/ИЛИ/слова, которые вы ищете; (2) вы используете опции -A и -B с достаточно большими номерами (больше, чем количество строк вашего файла).

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

не будет работать с 'tail -f' – mtk

5

я имел необходимость выделения строк в текстовых файлах, а не найти способ, который подходит моим потребностям, поэтому я написал простую программу, C, чтобы раскрасить строки, соответствующие регулярные выражения.

Вы можете загрузить исходный код с GitHub:

git clone http://github.com/mbornet-hl/hl 

затем:

cd hl/cr; make 

Здесь использование:

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 

Чтобы раскрасить слово "красный" в красном , а слово «синий» синим цветом, вам просто нужно ввести следующую команду:

echo "red blue red blue" | hl -r red -b blue 

и вот пример, чтобы выделить вывод команды 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]*' 

Порядок, в котором вы указываете цвет Важно: если строка соответствует несколько регулярных выражений, 1-ый, как более высокий приоритет, чем второй, второй - как более высокий приоритет, чем третий, и т. д.

Надеюсь, что это поможет.

0

cxpgrep подходит для этого - выделите узоры разных цветов.

cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY 
0

Мой ответ ниже:

tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"} '/MALE/' {print "\033[33m" $0 "\033[39m"}