Como colorir colunas de saída de ls?

8

Tipo de título diz tudo: Eu gostaria de obter as colunas coloridas da saída de algo como ls -al , digamos, como em resposta do 10basetom para esta questão .

    
por Pirx 14.02.2018 / 00:39

2 respostas

8

Isso é factível com awk . Infelizmente, como o formato de ls -l não é especificado, não é possível encontrar uma solução que funcione em todos os sistemas, portanto, algum ajuste de qual cor será usada em qual coluna será necessária em alguns sistemas.

Primeiramente, queremos preservar os espaços originais usados por ls -l . Caso contrário, o alinhamento da coluna estará incorreto. Podemos fazer isso com a opção FPAT , graças a esta resposta SO :

ls -la | awk '
    BEGIN {
        FPAT = "([[:space:]]*[^[:space:]]+)";
        OFS = "";
    }

Em awk , cada parâmetro posicional ( $1 , $2 , etc.) refere-se a um campo, ou seja, uma coluna na linha atual. O que a opção FPAT fez foi redefinir cada campo para incluir todos os espaços anteriores, então, quando você print voltar, ele manterá os espaços para que as colunas fiquem na mesma posição.

Agora podemos simplesmente editar cada campo para inserir o código de cor e, em seguida, imprimir a saída editada:

    {
        $2 = "3[31m" $2 "3[0m";
        $3 = "3[36m" $3 "3[0m";
        $4 = "3[36m" $4 "3[0m";
        $5 = "3[31m" $5 "3[0m";
        $6 = "3[36m" $6 "3[0m";
        $7 = "3[36m" $7 "3[0m";
        $8 = "3[31m" $8 "3[0m";
        print
    }
'

Observe que cada coluna é redefinida para o padrão (o 0 entre o [ e m ) depois. Se você quiser que a cor seja executada em várias colunas, poderá omitir esse código. Pessoalmente, prefiro especificar cada coluna independentemente.

Você pode definir o comando reutilizável em .bashrc . Por exemplo:

lsc() {
    ls -la | awk '
        BEGIN {
            FPAT = "([[:space:]]*[^[:space:]]+)";
            OFS = "";
        }
        {
            $2 = "3[31m" $2 "3[0m";
            $3 = "3[36m" $3 "3[0m";
            $4 = "3[36m" $4 "3[0m";
            $5 = "3[31m" $5 "3[0m";
            $6 = "3[36m" $6 "3[0m";
            $7 = "3[36m" $7 "3[0m";
            $8 = "3[31m" $8 "3[0m";
            print
        }
    '
}

Pode ser necessário reiniciar sua bash session (ou executar source ~/.bashrc ) para que esta definição de função seja executada.

A partir daqui, você pode simplesmente chamar lsc , que deve fornecer a saída desejada:

    
por 14.02.2018 / 01:22
6

Isso imprimirá a segunda coluna de ls -alF em vermelho, a terceira até a oitava em azul e a nona em preto:

ls -alF | awk -v black=$(tput setaf 0) -v red=$(tput setaf 1) -v blue=$(tput setaf 4) '{$2=red $2; $3= blue $3; $9=black $9} 1'

Isso é apenas um exemplo. Você pode personalizar isso para o conteúdo do seu coração.

Para aqueles que preferem o código espalhado por várias linhas:

ls -alF | awk -v black=$(tput setaf 0) \
    -v red=$(tput setaf 1) \
    -v blue=$(tput setaf 4) \
    '{
        $2=red $2
        $3= blue $3
        $9=black $9
     }

     1'

Detalhes

tput é um utilitário para gerar uma ampla variedade de códigos de controle para o seu terminal. Por exemplo, tput setaf n define a cor de primeiro plano como n , em que n pode variar de 0 a 7

0 – Black
1 – Red
2 – Green
3 – Yellow
4 – Blue
5 – Magenta
6 – Cyan
7 – White

Você pode ler mais sobre tput e suas capacidades de cor aqui .

O código awk define as variáveis black , red e blue que contêm os códigos de terminal para preto, vermelho e azul, respectivamente. Esses códigos são colocados no início de qualquer coluna que quisermos colorir.

Um truque é que os códigos de cores não são redefinidos por conta própria. Assim, qualquer que seja a última cor especificada em uma linha, a menos que outro comando de cor seja especificado, seja a cor padrão da próxima linha.

    
por 14.02.2018 / 01:04

Tags