Como colorir colunas de saída de ls?

8

O título diz tudo: eu gostaria de obter aquelas colunas coloridas da saída de algo como ls -al, digamos, como na resposta de 10basetom a esta pergunta .

Captura de tela do snippet de código destacado pela sintaxe da resposta vinculada

Pirx
fonte
Bem, essa é uma ideia interessante! Mas em qual SO você está?
JakeGould
2
Parece que (incorretamente) a sintaxe do bash é destacada pelo software SE. Parece que não é colorido por coluna, mas os dígitos (números) têm uma cor e qualquer coisa que comece com maiúscula tem outra. A coloração por coluna é factível, mas bastante diferente.
13008 Bob
3
No sentido geral, você pode dividir a saída nos separadores de coluna com sedou awke inserir uma sequência de escape ANSI .
1300 Bob
Relacionados: superuser.com/q/665274
Tyson
Estou no subsistema Windows 10 Ubuntu, mas a transição para MacOS (dado o desastre completo que WinX acabou por ser ...)
Pirx

Respostas:

8

Isso é possível com awk. Infelizmente, como o formato de ls -lnão é especificado, não é possível encontrar uma solução que funcione em todos os sistemas; portanto, alguns ajustes de qual cor usar para qual coluna serão necessários em alguns sistemas.


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

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

Em awk, cada parâmetro posicional ( $1, $2etc.) refere-se a um campo, ou seja, uma coluna na linha atual. O que a FPATopção acima fez foi redefinir cada campo para incluir todos os espaços anteriores, portanto, quando você printvolta, mantém os espaços para que as colunas permaneçam na mesma posição.

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

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

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


Você pode definir um comando reutilizável no seu .bashrc. Por exemplo:

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

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

A partir daqui, você pode simplesmente ligar lsc, o que deve fornecer a saída que você deseja:

Captura de tela da saída colorida

Prumo
fonte
Caras incríveis, isso é quase o que eu quero ;-) Falando sério, eu gostaria de adicionar mais um toque e ter os nomes dos arquivos coloridos. ls -al --color = auto faria isso, mas se eu apenas adicionar a opção --color às soluções acima, os códigos de cores parecerão despojados. Podemos ficar estranhos para mantê-los?
Pirx
Segundo comentário, isso é mais por curiosidade: na resposta que referenciei na minha pergunta original, parece que o 10basetom não usou nenhuma das opções acima e ainda tinha as colunas coloridas. Gostaria de saber se é porque ele usou uma versão diferente do sl, ou algum terminal inteligente chique?
Pirx
@Pirx A coloração na resposta é aplicada pelo software Stack Exchange. Não está vindo do terminal deles. É apenas porque a saída foi colada em um bloco de código e a pergunta tinha uma tag bash , que tenta aplicar automaticamente a sintaxe do Bash realçando a qualquer tag de código na pergunta e nas respostas ... o que é realmente incorreto nesse caso. O mesmo motivo pelas quais as strings do código estão vermelhas na minha resposta, mesmo que eu não as tenha intencionalmente colorido.
Bob
11
@Pirx Use --color=always. Contanto que você não aplique cores diferentes à coluna nome do arquivo ( $9no meu exemplo), awkdeve passar por elas.
Bob
Nota do @Pirx Side, --color=alwaysé uma extensão GNU, portanto, se você estiver em um sistema não-GNU (por exemplo, macOS, outros BSDs), será necessário instalar a versão GNU ou usar uma alternativa .
Bob
6

Isso imprimirá a segunda coluna ls -alFem vermelho, a terceira 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 seu 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 grande variedade de códigos de controle para o seu terminal. Por exemplo, tput setaf ndefine a cor do primeiro plano para nonde npode 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 tpute seus recursos de cores aqui .

O código awk define variáveis black, rede blueque 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 queremos colorir.

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

John1024
fonte
11
Bom, boa chamada para definir variáveis. Não sabia que você poderia fazer isso de dentro awk! Eu sugiro que você incluir o padrão para preservar o alinhamento da coluna também :)
Bob
@ Bob E, eu gosto do seu FPATtruque para manter o espaçamento correto.
John1024