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 .
sedou awke inserir uma sequência de escape ANSI .
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 .
sedou awke inserir uma sequência de escape ANSI .
Respostas:
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:
--color=always. Contanto que você não aplique cores diferentes à coluna nome do arquivo ( $9no meu exemplo), awkdeve passar por elas.
--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 .
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'
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.
awk! Eu sugiro que você incluir o padrão para preservar o alinhamento da coluna também :)
FPATtruque para manter o espaçamento correto.