Ответ 1
Вот несколько способов сделать это:
grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
Я нахожу флаг grep
--color=always
, который будет чрезвычайно полезен. Однако grep только печатает строки со спичками (если вы не запрашиваете контекстные строки). Учитывая, что каждая строка, которую он печатает, имеет совпадение, подсветка не добавляет столько возможностей, сколько могла.
Мне бы очень понравился cat
файл и посмотреть весь файл с выделенными совпадениями шаблона.
Есть ли способ передать grep для печати каждой строки, прочитанной независимо от того, существует ли совпадение? Я знаю, что я мог написать script для запуска grep в каждой строке файла, но мне было любопытно, возможно ли это со стандартным grep
.
Вот несколько способов сделать это:
grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
Здесь что-то такое же. Скорее всего, вы все равно будете использовать меньше, поэтому попробуйте следующее:
less -p pattern file
Он выделит шаблон и перейдет к первому вхождению в файл.
Я бы рекомендовал ack - лучше, чем grep, инструмент поиска мощности для программистов.
$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
$ ack --color --passthru pattern files | less -R
$ export ACK_PAGER_COLOR="${PAGER:-less -R}" $ ack --passthru pattern files
Мне это нравится, потому что он по умолчанию рекурсивный поиск каталогов (и делает намного умнее, чем grep -r
), поддерживает полные регулярные выражения Perl (а не POSIXish regex(3)
) и имеет гораздо более приятный контекстный дисплей при поиске многих файлов.
Вы также можете создать псевдоним. Добавьте эту функцию в свой .bashrc(или .bash_profile в osx)
function grepe {
grep --color -E "$1|$" $2
}
Теперь вы можете использовать псевдоним следующим образом: "ifconfig | grepe inet
" или "grepe css index.html
".
(PS: не забудьте source ~/.bashrc
перезагрузить bashrc в текущем сеансе)
Вы можете использовать мой highlight
script из https://github.com/kepkin/dev-shell-essentials
Он лучше, чем grep
, потому что вы можете выделить каждое соответствие своим собственным цветом.
$ command_here | highlight green "input" | highlight red "output"
Используйте colout
программу: http://nojhan.github.io/colout/
Он предназначен для добавления цветовых оттенков в текстовый поток. Учитывая регулярное выражение и цвет (например, "красный" ), он воспроизводит текстовый поток с выделенными совпадениями. например:
# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile
Вы можете связать несколько вызовов, чтобы добавить несколько разных цветовых оттенков:
tail -f /var/log/nginx/access.log | \
colout ' 5\d\d ' red | \
colout ' 4\d\d ' yellow | \
colout ' 3\d\d ' cyan | \
colout ' 2\d\d ' green
Или вы можете добиться того же, используя регулярное выражение с N группами (в скобках), а затем список разделенных запятыми N цветов.
vagrant status | \
colout \
'\''(^.+ running)|(^.+suspended)|(^.+not running)'\'' \
green,yellow,red
Я использую rcg из "Linux Server Hacks", O'Reilly. Он идеально подходит для того, что вам нужно, и может выделять несколько выражений с разными цветами.
#!/usr/bin/perl -w
#
# regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
# eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE" /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);
my %target = ( );
while (my $arg = shift) {
my $clr = shift;
if (($arg =~ /^-/) | !$clr) {
print "Usage: rcg [regex] [color] [regex] [color] ...\n";
exit(2);
}
#
# Ugly, lazy, pathetic hack here. [Unquote]
#
$target{$arg} = eval($clr);
}
my $rst = RESET;
while(<>) {
foreach my $x (keys(%target)) {
s/($x)/$target{$x}$1$rst/g;
}
print
}
Хорошо, это один из способов,
wc -l filename
даст вам количество строк - скажем, NN, то вы можете сделать
grep -C NN --color=always filename
Вот оболочка script, которая использует функцию Awk gsub для замены текста, который вы ищете, с соответствующей escape-последовательности, чтобы отобразить его ярко-красным:
#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2
Используйте его так:
$ ./cgrep pattern [file]
К сожалению, у него нет всех функций grep.
Для получения дополнительной информации вы можете обратиться к статье "" Так вам нравится цвет" в Журнале Linux
Еще один ответ упоминал grep -Cn-переключатель, который включает в себя n строк контекста. Я иногда делаю это с n = 99 как быстрый и грязный способ получить [по крайней мере] экранный контекст, когда шаблон egrep кажется слишком затруднительным, или когда я нахожусь на машине, на которой я не установил rcg и/или ccze.
Недавно я обнаружил ccze
, который является более мощным колоризатором. Моя единственная жалоба заключается в том, что она ориентирована на экран (например, less
, которую я никогда не использую по этой причине), если вы не укажете ключ -A для вывода "raw ANSI".
+1 для упоминания rcg
. Он по-прежнему мой любимый, так как он настолько прост в настройке в псевдониме. Что-то вроде этого обычно находится в моем ~/.bashrc:
alias tailc = 'tail -f/my/app/log/file | rcg отправить "BOLD GREEN" получить сообщение "CYAN" "RED" '
Я добавил это в свой .bash_aliases:
highlight() {
grep --color -E "$1|\$"
}
другой грязный способ:
grep -A80 -B80 --color FIND_THIS IN_FILE
Я сделал
alias grepa='grep -A80 -B80 --color'
в bashrc.
В качестве альтернативы вы можете использовать Silver Searcher и
ag <search> --passthrough
Если вы хотите выделить несколько шаблонов с разными цветами, см. this bash script.
Основное использование:
echo warn error debug info 10 nil | colog
Вы можете изменять шаблоны и цвета во время нажатия одной клавиши, а затем вводить клавишу.
Чтобы выделить шаблоны во время просмотра всего файла, h может сделать это.
Плюс он использует разные цвета для разных шаблонов.
cat FILE | h 'PAT1' 'PAT2' ...
Вы можете также вывести вывод h
в less -R
для лучшего чтения.
Чтобы grep и использовать 1 цвет для каждого шаблона, cxpgrep может быть в хорошей форме.