comando `destaque`


11

Existe um comando que pode ser usado para realçar facilmente (com cores, texto em negrito ou invertido costas / primeiro plano) seqüências específicas em stdin enquanto passa toda a sequência para stdout? Estou pensando em construí-lo , mas prefiro usá-lo se ele já existir. Algumas características desejáveis:

  1. Seqüências de destaque separadas são destacadas de maneira diferente, de maneira automática. Por exemplo, a primeira corda será destacada em vermelho, a segunda em verde e a terceira em azul sem configuração manual .
  2. Detecta o suporte de cores e volta a métodos de realce em negrito / invertido / outros, quando disponíveis.
  3. Permite a correspondência de expressões regulares e cadeias literais.
  4. De preferência, faça algo inteligente se as correspondências se sobreporem, como "foobar" e "barbar".
  5. Nada é modificado entre stdin e stdout, exceto pela adição de códigos de cores.


Ooo, boa pergunta. Eu precisava dessa coisa exata e acabou escrevendo alguma coisa, mas apenas um código de cores cordas fixas, não tinha nenhuma das características que você listou
Michael Mrozek

Em vez de escrever um novo utilitário, seria super impressionante ver isso como uma adição ao grep em si.
mattdm

1
A filosofia unix adequada seria um novo utilitário que pode ser canalizado não apenas pelo grep, mas também por outros fluxos. Eu suspeito que há pelo menos um ou mais módulos de Perl que provavelmente pode fazer isso por você, mas ...
Shadur

1
@ Gilles: Essa questão é muito mais limitada em escopo. De fato, a leitura foi uma das razões pelas quais criei esta pergunta - Pedir uma solução mais geral e flexível.
l0b0

Respostas:


4

Talvez o corante genérico de Radovan Garabík (grc) ? Ele espera um arquivo de configuração como argumento e funciona com o regexp. Portanto, não completamente sem a configuração, mas você pode usar a substituição do processo do processo ( <(list)); portanto, sem qualquer configuração manual :-)


Para esclarecer sem precisar abrir a página (e torná-la pesquisável), "this one" == Colouriser genérico ; grc e grcat ... Obrigado, eu gosto.
Peter.O

grctem um script auxiliar: grcat. Aqui está um exemplo de colorir todas as letras maiúsculas em vermelho. Etapa 1: Configure o arquivo de configuração: printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps Etapa 2; Use-o: echo Hello World | grcat red-caps... A página de manual indica três diretórios de configuração que ele pesquisa e sugere (?) Que o arquivo de configuração pode ser um caminho absoluto, mas esse último método de encontrar o arquivo de configuração funciona apenas com caminhos relativos para mim (grc versão 1.3)
Peter.O

5

Sed para o resgate!

Você pode melhorar isso (como realmente precisa), mas funciona muito bem.

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

Por uma questão de simplicidade, o hilight aceita dois argumentos (primeiro a partida, depois a cor). Nesse script, o atributo é sempre em negrito

Leia man console_codes (Graphic Rendition) para ver as secuências de escape de cores ou tente isso

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

Tem desvantagens importantes, pois o uso deste funciona:

$ dmesg | hilight \\[ 34 ] 34

mas isso não é de todo:

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

porque [: digit:] encontra os números nas secuências de escape de suprimentos anteriores.

Algo como:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

sempre funcionará como exceção.

Usando o comando time, encontrei esse aumento em quatro vezes o tempo decorrido, o que não é muito.

Você pode substituir o comando sed por qualquer outro analisador que desejar ou atenda às suas necessidades (awk, etc ...)


2

Pode-se também usar egrep com padrão que corresponde a cada linha em caracteres não imprimíveis, como:

dmesg | egrep --color "swap|$"

1

clide funciona bem. Eu o uso no RHEL 6.2, do repositório EPEL


+1 para uma ferramenta muito boa. Infelizmente, ele não possui todos os recursos solicitados.
L0b0 29/02/12

1

Se a sua versão do grepvem com coloração, você pode usar a alteração regexp para fazer com que o grep destaque o texto e também corresponda a todas as linhas para que nada seja excluído. O seguinte deve fazer o truque:

<your command> |grep "highlightme\|^"

0

Como você mencionou no link, grep --color=alwaysfunciona apenas para um padrão. Dito isto, não acredito que essa ferramenta exista.


0

Eu uso http://em.readthedocs.org/ . Fácil de instalar em várias plataformas por causa do Python. Simples e funciona bem.


Bem-vindo ao Unix e Linux Stack Exchange! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
slm

1
De acordo com o centro de ajuda : "No entanto, você deve divulgar sua afiliação em suas respostas." Caso você seja o mesmo Igor Kalnitsky que escreveu em, reformule sua resposta para ficar claro que você não é um usuário, mas o autor da ferramenta sugerida.
manatwork
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.