Evite cores de quebra de relógios

5

Estou alterando os scripts no trabalho que monitoram os arquivos de log para destacar determinados itens e colori-los. A saída final é uma lista de números de 6 dígitos em várias colunas. Eu pude adicionar um ~ ao início do número, e ele não quebra nada na saída final, mas é bastante feio e difícil de ler. No entanto, quando eu tento colorir o número, seja nos scripts anteriores do bash ou no processamento final dos dados em um script perl, o texto colorido fica corrompido.

Por exemplo, o número original, que eu colocarei em $num :

123456

Eu insiro isso em perl (ou, a mesma coisa no bash):

"\e[1;34m" . $num . "\e[0m"

E aqui está o que eu recebo:

[1;34m123456[0m 

Eu também tentei isso, uma versão com escape, mas obtenho a mesma coisa:

"\x1B[1;34m" . $num . "\x1B[0m"

Se isso faz diferença, aqui está a pilha real de scripts (é uma bagunça):

  • Perl chamado dentro do script de shell, que é enviado para grep / cut / etc.
  • script de shell com mais cut / etc. e, em seguida, canaliza para .pl
  • script de shell observa essa saída

Talvez watch não goste de cores?

Eu não conheço perl muito bem, então acho que não faria mal mostrar o que estou vendo nas linhas de impressão:

my $format = ("%-8s") x scalar(@{$a[0]});

printf("$format\n", @$_)
    
por Ken Oh 30.06.2012 / 00:46

3 respostas

7

Eu encontrei os problemas de 'roubo de cores' com watch , porque o watch usa um estilo simples de saída / bin / sh, que provoca alguma cor, apelidos, atalhos ... a coisa toda!

Então, eu juntei tudo isso, colocado em meu .bashrc , permite que eu use todos os meus próprios atalhos, atalhos e outros enfeites:

Usage:
    watcher 20 'somecommand | apipe | grep'

O número é o atraso entre as atualizações, em segundos, o comando pode incluir qualquer coisa que você possa citar.

###### 'watch' workalike, lets me use my aliases and such
function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; }

Para dividir:

function watcher()
{ 
  WATCHERTIME=$1
  WATCHERFILE=/tmp/watcher$$
  shift
  while true; do
    WATCHERHEIGHT=$(($LINES - 5))
    ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null
    clear
    /bin/echo -n "Every ${WATCHERTIME} seconds - "
    date
    /bin/echo
    cat ${WATCHERFILE}
    \rm -f ${WATCHERFILE}
    /bin/echo
    /bin/echo "=="
    sleep ${WATCHERTIME}
  done
}

Ele determina a altura da tela atual em linhas, subtrai o suficiente para sua própria saída, depois executa repetidamente o comando fornecido, então limpa a tela, exibe a saída e aguarda o próximo loop. Ele exibe um curto "==" na parte inferior para indicar onde a saída terminou. Às vezes é útil saber disso.

Eu fiz desta maneira, então houve o menor atraso possível ao exibir. se você não capturar a saída e, em seguida, exibir, você terá uma longa pausa e, em seguida, a saída ... icky.

Como não estraga as cores, você obtém tudo o que está acostumado a obter. Aproveite!

    
por 30.06.2012 / 10:04
6

O problema é que watch usa Curses e as funções de saída de curses funcionam em um framebuffer virtual com planos separados para caracteres e seus atributos / cores. As strings são enviadas para o framebuffer como estão, sem interpretação da diretiva terminal. Para proteger contra a invasão do estado do terminal, o Curses ignora ESC (entre outras coisas), portanto, watch não fará a cor por padrão.

Você pode corrigir isso seguindo o sábio conselho de jw013 ou lornix : use watch --color ou envolva seu script em algo como um loop while true; do clear; $SCRIPT; sleep 2; done .

    
por 30.06.2012 / 14:40
5

Você provavelmente precisará da opção --color para watch .

    
por 30.06.2012 / 01:29

Tags