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 .
sed
ou awk
e 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 .
sed
ou awk
e inserir uma sequência de escape ANSI .
Respostas:
Isso é possí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, 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 FPAT
opção, graças a esta resposta do 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 FPAT
opção acima fez foi redefinir cada campo para incluir todos os espaços anteriores, portanto, quando você print
volta, 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 0
entre [
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 bash
sessã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 ( $9
no meu exemplo), awk
deve 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 -alF
em 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 n
define a cor do primeiro plano para n
onde 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 seus recursos de cores aqui .
O código awk define 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 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 :)
FPAT
truque para manter o espaçamento correto.