Grep colorido – visualizando o arquivo inteiro com correspondências destacadas

Eu acho que o grep ‘s --color=always flag é tremendamente útil. No entanto, o grep só imprime linhas com correspondências (a menos que você peça linhas de contexto). Como cada linha impressa tem uma correspondência, o realce não adiciona a maior capacidade possível.

Eu realmente gostaria de cat um arquivo e ver o arquivo inteiro com as correspondências de padrão destacadas.

Existe alguma maneira que eu possa dizer ao grep para imprimir todas as linhas sendo lidas, independentemente de haver uma correspondência? Eu sei que eu poderia escrever um script para executar o grep em cada linha de um arquivo, mas eu estava curioso para saber se isso era possível com o padrão grep .

Aqui estão algumas maneiras de fazer isso:

 grep --color -E 'pattern|$' file grep --color 'pattern\|$' file egrep --color 'pattern|$' file 

Aqui está algo ao longo das mesmas linhas. As chances são de que você estará usando menos de qualquer maneira, então tente isto:

 less -p pattern file 

Ele destacará o padrão e saltará para a primeira ocorrência dele no arquivo.

Eu gostaria de recomendar o ack – melhor que o grep, uma ferramenta de pesquisa de energia para programadores .

 $ ack --color --passthru --pager = "$ {PAGER: -less -R}" arquivos padrão
 $ ack --color --passthru arquivos padrão |  menos -R
 $ export ACK_PAGER_COLOR = "$ {PAGER: -less -R}"
 arquivos de padrão $ ack --passthru

Eu adoro isso porque ele padroniza a busca recursiva de diretórios (e faz muito mais inteligente que o grep -r ), suporta expressões regulares Perl completas (ao invés do POSIXish regex(3) ), e possui uma exibição de contexto muito melhor quando procura muitos arquivos .

Você também pode criar um alias. Adicione esta function em seu .bashrc (ou .bash_profile no osx)

 function grepe { grep --color -E "$1|$" $2 } 

Agora você pode usar o alias como este: ” ifconfig | grepe inet ” ou ” grepe css index.html “.

(PS: não se esqueça de source ~/.bashrc para recarregar o bashrc na session atual)

Você pode usar meu script de highlight em https://github.com/kepkin/dev-shell-essentials

É melhor que grep porque você pode destacar cada partida com sua própria cor .

 $ command_here | highlight green "input" | highlight red "output" 

Captura de tela do projeto Github

Use o programa colout : http://nojhan.github.io/colout/

Ele foi projetado para adicionar realces de colors a um stream de texto. Dado um regex e uma cor (por exemplo, “vermelho”), ele reproduz um stream de texto com correspondências destacadas. por exemplo:

 # cat logfile but highlight instances of 'ERROR' in red colout ERROR red  

Você pode encadear várias invocações para adicionar vários destaques de colors diferentes:

 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 

Ou você pode conseguir a mesma coisa usando um regex com N grupos (partes do parêntese do regex), seguido por uma lista separada por vírgulas de N colors.

 vagrant status | \ colout \ '\''(^.+ running)|(^.+suspended)|(^.+not running)'\'' \ green,yellow,red 

Eu uso rcg de “Linux Server Hacks”, O’Reilly. É perfeito para o que você quer e pode destacar várias expressões, cada uma com colors diferentes.

 #!/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 } 

Eu adicionei isso ao meu .bash_aliases:

 highlight() { grep --color -E "$1|\$" } 

Ok, esta é uma maneira

 wc -l filename 

vai te dar a contagem de linha – digamos NN, então você pode fazer

 grep -C NN --color=always filename 

Aqui está um script de shell que usa a function gsub do Awk para replace o texto que você está procurando pela sequência de escape adequada para exibi-lo em vermelho shiny:

 #! /bin/bash awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2 

Use assim:

 $ ./cgrep pattern [file] 

Infelizmente, não possui todas as funcionalidades do grep.

Para mais informações, você pode consultar um artigo ” So You Like Color ” no Linux Journal.

Uma outra resposta mencionou o switch -n do grep que inclui n linhas de Context. Eu às vezes faço isso com n = 99 como uma maneira rápida e suja de obter [pelo menos] uma canvas cheia de contexto quando o padrão egrep parece muito complicado, ou quando estou em uma máquina na qual eu não instalei rcg e / ou ccze.

Recentemente descobri o ccze que é um colorizador mais poderoso. Minha única reclamação é que ele é orientado para a canvas (como less , o que eu nunca uso por esse motivo), a menos que você especifique a opção -A para a saída “ANSI bruta”.

+1 para a menção rcg acima. Ainda é meu favorito, pois é tão simples de personalizar em um alias. Algo como isto é geralmente no meu ~ / .bashrc:

alias tailc = ‘tail -f / meu / app / log / file | rcg send “BOLD GREEN” recebe o erro “CYAN” “RED” ‘

outro jeito sujo:

 grep -A80 -B80 --color FIND_THIS IN_FILE 

Eu fiz um

 alias grepa='grep -A80 -B80 --color' 

em bashrc.

Alternativamente, você pode usar o Silver Searcher e fazer

 ag  --passthrough 

Se você quiser destacar vários padrões com colors diferentes, veja este script bash.

Uso básico:

 echo warn error debug info 10 nil | colog 

Você pode alterar padrões e colors enquanto executa pressionando uma tecla e, em seguida, insira a chave.

Para destacar padrões enquanto visualiza o arquivo inteiro, h pode fazer isso.

Além disso, usa colors diferentes para diferentes padrões.

 cat FILE | h 'PAT1' 'PAT2' ... 

Você também pode canalizar a saída de h para less -R para melhor leitura.

Para grep e usar 1 cor para cada padrão, cxpgrep poderia ser um bom ajuste.