El título lo dice todo: me gustaría obtener esas columnas de color claro de la salida de algo como ls -al
, por ejemplo, como en la respuesta de 10basetom a esta pregunta .
sed
o awk
e insertar una secuencia de escape ANSI .
El título lo dice todo: me gustaría obtener esas columnas de color claro de la salida de algo como ls -al
, por ejemplo, como en la respuesta de 10basetom a esta pregunta .
sed
o awk
e insertar una secuencia de escape ANSI .
Respuestas:
Esto es factible con awk
. Desafortunadamente, dado que el formato ls -l
no está especificado, no es posible encontrar una solución que funcione en todos los sistemas, por lo que algunos ajustes de qué color usar para qué columna serán necesarios en algunos sistemas.
En primer lugar, queremos preservar los espacios originales utilizados por ls -l
. De lo contrario, la alineación de la columna será incorrecta. Podemos hacer esto con la FPAT
opción, gracias a esta respuesta SO :
ls -la | awk '
BEGIN {
FPAT = "([[:space:]]*[^[:space:]]+)";
OFS = "";
}
En awk
, cada parámetro posicional ( $1
, $2
, etc.) se refiere a un campo, la columna uno es decir, en la fila actual. Lo que hizo la FPAT
opción anterior fue redefinir cada campo para incluir todos los espacios anteriores, de modo que cuando print
retrocede mantiene los espacios para que las columnas permanezcan en la misma posición.
Ahora podemos simplemente editar cada campo para insertar el código de color y luego imprimir la salida 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 columna se restablece a los valores predeterminados ( 0
entre el [
y m
) después. Si desea que el color se ejecute en varias columnas, puede omitir ese código. Personalmente, prefiero especificar cada columna de forma independiente.
Puede definir un comando reutilizable en su .bashrc
. Por ejemplo:
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
}
'
}
Es posible que deba reiniciar su bash
sesión (o ejecutar source ~/.bashrc
) para que se ejecute esta definición de función.
Desde aquí, solo puede llamar lsc
, lo que debería darle la salida que desea:
--color=always
. Siempre que no aplique diferentes colores a la columna del nombre de archivo ( $9
en mi ejemplo), awk
debería pasarlos.
--color=always
es una extensión GNU, por lo que si está en un sistema que no es GNU (por ejemplo, macOS, otros BSD) deberá instalar la versión GNU o utilizar una alternativa .
Esto imprimirá la segunda columna ls -alF
en rojo, la tercera a octava en azul y la novena en negro:
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'
Esto solo pretende ser un ejemplo. Puede personalizar esto al contenido de su corazón.
Para aquellos que prefieren su código distribuido en varias líneas:
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
es una utilidad para generar una amplia variedad de códigos de control para su terminal. Por ejemplo, tput setaf n
establece el color de primer plano en n
donde n
puede variar de 0 a 7
0 – Black
1 – Red
2 – Green
3 – Yellow
4 – Blue
5 – Magenta
6 – Cyan
7 – White
Puede leer más sobre tput
y sus capacidades de color aquí .
El código awk define variables black
, red
y blue
que contienen los códigos de terminal para negro, rojo y azul, respectivamente. Estos códigos se colocan al comienzo de cualquier columna que queramos colorear.
Un truco es que los códigos de color no se restablecen por sí solos. Entonces, cualquiera que sea el último color que especifique en una línea, a menos que se especifique otro comando de color, será el color predeterminado para la siguiente línea.
awk
! Te sugiero que incluyas el patrón para preservar la alineación de la columna también :)
FPAT
truco para mantener el espacio correcto.