¿Cómo colorear columnas de salida de ls?

8

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 .

Captura de pantalla del fragmento de código resaltado de sintaxis de la respuesta vinculada

Pirx
fuente
Bueno, esta es una buena idea! ¿Pero en qué sistema operativo estás?
JakeGould
2
Parece que la sintaxis Bash está resaltada por el software SE. Parece que no está coloreado por columna, sino que los dígitos (números) obtienen un color y todo lo que comienza con mayúscula obtiene otro. Colorear por columna es factible pero bastante diferente.
Bob
3
En el sentido general, puede dividir la salida en los separadores de columna con sedo awke insertar una secuencia de escape ANSI .
Bob
Relacionado: superuser.com/q/665274
Tyson
Estoy en el subsistema de Windows 10 Ubuntu, pero estoy haciendo la transición a macOS (dado el desastre completo que resultó ser
WinX

Respuestas:

8

Esto es factible con awk. Desafortunadamente, dado que el formato ls -lno 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 FPATopció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 FPATopción anterior fue redefinir cada campo para incluir todos los espacios anteriores, de modo que cuando printretrocede 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 ( 0entre 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 bashsesió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:

Captura de pantalla de salida en color

Beto
fuente
Chicos geniales, esto es casi lo que quiero ;-) En serio, sin embargo, me gustaría agregar un giro más y tener los nombres de los archivos coloreados. ls -al --color = auto haría eso, pero si solo agrego la opción --color a las soluciones anteriores, los códigos de color parecen ser eliminados. ¿Podemos conseguir awk para mantenerlos?
Pirx
Segundo comentario, esto es más por curiosidad: en la respuesta a la que hice referencia en mi pregunta original, parece que 10basetom no usó ninguno de los anteriores, y todavía tenía las columnas de colores. Me pregunto si eso se debe a que usó una versión diferente de ls, o algún terminal inteligente elegante.
Pirx
@Pirx El color en la respuesta se aplica mediante el software Stack Exchange. No viene de su terminal. Es solo porque la salida se pegó en un bloque de código y la pregunta tenía una etiqueta bash , que automáticamente intenta aplicar el resaltado de sintaxis Bash a cualquier etiqueta de código en la pregunta y las respuestas ... lo que en realidad es incorrecto en este caso. La misma razón por la que las cadenas del código son rojas en mi respuesta, aunque no las coloreé intencionalmente.
Bob
1
Uso @Pirx --color=always. Siempre que no aplique diferentes colores a la columna del nombre de archivo ( $9en mi ejemplo), awkdebería pasarlos.
Bob
@Pirx Nota al margen, --color=alwayses 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 .
Bob
6

Esto imprimirá la segunda columna ls -alFen 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'

Detalles

tputes una utilidad para generar una amplia variedad de códigos de control para su terminal. Por ejemplo, tput setaf nestablece el color de primer plano en ndonde npuede 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 tputy sus capacidades de color aquí .

El código awk define variables black, redy blueque 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.

John1024
fuente
1
Huh, buen llamado para definir variables. ¡No sabía que podías hacer eso desde dentro awk! Te sugiero que incluyas el patrón para preservar la alineación de la columna también :)
Bob
@Bob Y, me gusta tu FPATtruco para mantener el espacio correcto.
John1024